実践型AIプログラミング特講 python #2

実践型AIプログラミング特講 python  #2

AIプログラミング特講第二弾は具体的なコーディングを踏まえたAIの有用性を解説しさせて頂きます。まだAIプログli 魔イング特講第一弾の方をご覧になってない方はブラウザバックしていただいてまずは第一弾の方から読み進めていただけると理解がしやすくなると存じます。

機械学習が実用化された理由

昨今、機械学習が実用化されたのには理由があります。1つ目の理由は、インターネットの普及により、大量のデータが手軽に入手できるようになったことです。インターネット上には、さまざまなデータが公開されています。それらを利用することで驚くほど簡単に、それまで考えられなかったような大量のデータをダウンロードし、活用することができるようになりました。2つ目の理由は、コンピューターの高性能化です。大量のデータが目の前にあったとしても、それらを処理するためのマシンがなければ話になりません。コンピューターの性能は、以前より大量のデータを処理できるようになりました。とくに、ディープラーニングを実践するには高機能なマシンが必要であり、少し前のマシンではとても動かすことができませんでした。コンピューターが高性能になって、はじめて第三次 AI ブームが到来する土壌が整ってきたのです。

機械学習の仕組みは?

当然のことですが、機械学習は何でもやってくれる魔法の箱ではありません。入力されたデータを元にして、計算処理が行われ、その結果として学習成果が出力されます。そのため、入力するデータをしっかりと整形しておく必要がありますし、機械学習を使えば、何でも実現可能という訳ではありません。ここで、簡単に機機械学習の仕組みを紹介しましょう。機械学習の仕組みは、まったくのブラックボックスではありません。簡単な分類問題からその仕組みを考えてみましょう。ある食品●と▲の2種類の成分データがあるとしましょう。これらのデータをグラフ上にプロットしてみました。すると成分の違いから次のようにハッキリと分かれたグラフになりました。ここで問題です。ある日、助手のSさんが適当な箱から食品を取り出したのですが、何を取り出したのかわからなくなってしまいました。そこで、Sさんが取り出した食品が●なのか▲なのか判定したいと思います。その成分を調べてグラフにプロットすると、★の位置になりました。この食品は、●と▲のどちらでしょうか。

▲ ●と▲のデータについてそうですね。ぱっと見ただけで、★が食品●であることがわかります。それは、★が他の●の近くにプロットされているため、人間の目には明らかです。しかし、これをプログラムで処理するにはどうしたら良いでしょうか。プログラムを作って機械的に判定したい場合には、●と▲の境界線を引いて、その上か下にあるかを調べれば、簡単に答えを出すことができます。

▲境界線を引くと機械的に判定可能それでは、この食品の判定を行う Python の疑似プログラムを作ってみましょう。ここで引いた境界線が「y=13x」の式に当てはまるものとするなら、次のようなプログラムで判定できます。

def check_food (x, y):

threshold = 1.3 * x # xにおける境界線の位置

if y >= threshold: # 境界線上かそれより上

print(“それは▲です”)

else: # 境界線より下

print(“それは●です”)

そこで、この境界線をどのように引くのかという点が問題になります。機械学習では、さまざまな手法を利用して、この境界線を決定していきます。もちろん、上記のような単純な境界線ではなく複雑なものとなります。しかも、大量のデータを学習することで、境界線の角度や位置を調整していくことになります。

機械学習の種類

さて、一口に『機械学習』と言っても、いくつかの種類に分類できます。大まかに「教師あり学習」と「教師なし学習」と「強化学習」に分けることができます。

教師あり学習

データと共に正解が与えられる未知のデータに対して予測を行う

教師なし学習

正解データは与えられない未知のデータから規則性を発見する

強化学習

行動により部分的に正解が与えられるデータから最適な解を見つける

ここで出てきた『教師あり学習(supervised learning)』とは、事前に与えられたデータを、言わば先生からの例題と見なして、それを元に学習を行う手法です。教師あり学習では、一般的に、データを入力する際、そのデータが何に分類されるのか、答えとなるラベルとデータをセットで与えます。先ほど考えたリンゴとミカンの分類も、この教師あり学習の良い例です。実際のリンゴとミカンの画像を教師データとして、何の画像を表しているのかをセットで分類器に与えます。

そして、機械は学習し、モデルを構築します。モデルを構築したら、未知のデータに対しても予測結果を返すことができます。次に、教師あり学習に対して『教師なし学習(unsupervised learning)』があります。これは「出力すべきもの」があらかじめ決まっていないという点で大きく異なっています。データの背後に存在する本質的な構造を抽出するために用いられます。つまり、与えられたデータを外的基準なしに、自動的に分類します。先ほど紹介したクラスタリングも、教師なし学習の1つです。クラスタ分析、主成分分析、ベクトル量子化、自己組織化マップなど、さまざまな手法があります。

また、そのほかに『強化学習(reinforcement learning)』があります。これは、現在の状態を観測し、取るべき行動を決定する問題を扱います。強化学習は教師あり学習と似ていますが、教師から完全な答えが提示されないという点が異なります。強化学習では、エージェント(行動の主体)と環境(状況や状態)が登場します。エージェントは環境を観察し、それに基づいて意志決定を行い行動します。すると環境が変化し、何らかの報酬がエージェントに与えられます。エージェントは、よりたくさんの報酬が得られる、より良い行動を学習していきます。強化学習を、ネコがエサを食べる過程で例えてみましょう。ここで、エージェントがネコ、環境が自動エサやり機と考えます。ネコは、自動エサやり機のなかに美味しいエサを発見します。しかし、ただ近づいただけでは、その香ばしいニオイをかぐことしかできません。

そこで、ネコはエサやり機の周りをクルクル回ったり、身体を擦り付けたりします。すると、自動エサやり機のスイッチが押され、エサがちょっとだけ出てきました。こうしてネコは、行動によりエサという報酬を得たのです。引き続き何度も身体を機械に擦り付けていると、赤いボタンに触れたときにエサが出ることに気づきます。最終的には、赤いボタンをただ鼻で突くとエサが出ることを覚え、いつでもお腹の空いたときにエサを食べられるようになります。このようにして、ネコは最良の行動を学習しました。このような学習をコンピューターで実現するのが強化学習です。

コラム

教師なし学習敵対的生成ネットワークについてさらに「教師なし学習」に分類されるものの中で、注目されているのが『敵対的生成ネットワーク(Generative Adversarial Network、略称:GAN)』です。これはデータから特徴を学習することで、実在しないデータを生成したり、存在するデータの特徴を元に変換を行うことができるというものです。たくさんの画像からその特徴を学習し、実際には実在しない写真画像を生成することができます。多くの人物の顔を学習させた場合、そこから実際には存在しない人間の顔を生成することができます。これを利用して、多くのアイドルの顔写真を学習し架空のアイドル写真を自動生成することも可能です。また、応用として手書きの線画を本物のように着色したり、人間の顔を元にアニメキャラクターを生成したりと、アイデア次第でいろいろな生成が可能です。敵対的生成ネットワークは、『生成ネットワーク(generator)』と『識別ネットワーク(discriminator)』の2つのネットワークで構成されます。生成ネットワークは入力データの特徴を元に新たなデータを生成し、識別ネットワークがそのデータの正誤を識別します。生成側は識別側を欺こうと学習し、識別側はより正確に識別しようと学習します。このような敵対する2つのネットワークが相反する目的のために競って学習することで、より本物らしい精度の高いデータを生成できます。

以上が第二弾の説明を終わりにしたいと思います。次回以降も本記事同様に具体的なコーディングも付随してご紹介させていただくのでよろしく御願いします。まだ気が早いようですが最終的には画像認証処理を読者様のローカル環境PCで実装するレベルまで実践的な講義になりますのでこれからの記事のアップロードを心待ちにしていただけると幸いです。

 

プログラミングカテゴリの最新記事