コンテンツにスキップ

第1章 ディープラーニング

1 環境の準備

ディープラーニングにも対応した機械学習ライブラリである「Tensorflow」の環境を構築すします。

pip install tensorflow

2 ニューラルネットワークとは?

ニューラルネットワークとは人間の脳の神経細胞であるニューロンの動作を元にプログラムを構築したものです。

ニューロンは複数の電気信号が入ってきて、その大きさを判断して1つの電気信号を出力します。それを模したプログラムがパーセプトロンです。

パーセプトロンはデータを入力するときにある数を掛けます。これを重み付けといいます。それらを合計し、ある一定値(バイアス)以上なら1を出力し、そうでないなら0を出力します。

例えば、and出力をパーセプトロンで表してみます。 引数 x1とx2には1または0が入ってくるものとします。これに重み付け係数(w1とw2)を掛けて、バイアス(0.5)以上なら1、そうじゃないなら0を返します。

per.ipynb に以下を記述してみましょう。

# ANDの例
def percep(x1, x2):
    w1  = 0.3 # 重み1
    w2  = 0.3 # 重み2
    b   = 0.5 # バイアス

    a   =  x1 * w1 + x2 * w2

    if  a  >=  b:
        y = 1
    else:
        y = 0

    return y # 出力

print(percep(0, 0))
print(percep(0, 1))
print(percep(1, 0))
print(percep(1, 1))

この関数は重み付け係数とバイアスを変えるだけでORにすることもできます。重み付け係数を0.5、バイアスを0.3にするだけです。NANDにするには、重み付け係数を-0.5、バイアスを-0.7にします。

このように、重み付け係数とバイアスを変更することで、さまざまな処理を行えるようにします。

3 多層ニューラルネットワーク

ニューラルネットワークはこのパーセプトロンをいくつもつなげます。そして最終的に0か1かの数値にします。

例えば、XORは一つのパーセプトロンでは実現できません。ANDとNANDの結果をORすることでXORを実現します。

def and_gate(x1, x2):
    w1 = 0.3
    w2 = 0.3
    b = 0.5
    a = x1 * w1 + x2 * w2
    return 1 if a >= b else 0

def or_gate(x1, x2):
    w1 = 0.5
    w2 = 0.5
    b = 0.3
    a = x1 * w1 + x2 * w2
    return 1 if a >= b else 0

def nand_gate(x1, x2):
    w1 = -0.5
    w2 = -0.5
    b = -0.7
    a = x1 * w1 + x2 * w2
    return 1 if a >= b else 0

def xor_gate(x1, x2):
    # 1層目: ANDゲートとNANDゲートで出力を計算
    and_output = and_gate(x1, x2)
    nand_output = nand_gate(x1, x2)

    # 2層目: ANDゲートとNANDゲートの出力をORゲートに統合
    xor_output = or_gate(and_output, nand_output)
    return xor_output

# テスト
print(xor_gate(0, 0))  # 出力: 0
print(xor_gate(0, 1))  # 出力: 1
print(xor_gate(1, 0))  # 出力: 1
print(xor_gate(1, 1))  # 出力: 0

このように複数のパーセプトロンを組み合わせ、複雑なことが可能になります。

4 ディープラーニング

例えば、あやめの分類を行うとします。

4つの数値が入力です(SepalLength、SepalWidth、PetalLength、PetalWidth)。これを入力として最終的に3つの出力(3種類のどれか)を得ます。この3つの出力がそれぞれその答えになる確率が入ります。

ニューラルネットワークでは、学習データを使い、正解になるような重みとバイアスを見つけていきます。この作業が学習となります。

ニューラルネットワークは画像にも適用できます。

画像は数値の配列と見なすことができます。これを入力とし出力を出します。最終的にはいくつかの出力のうちのどれか1つが1になるように計算を行います。1になったところが正解となります。

例えば、8×8の画像に書かれた数字を何の数か認識するとします。8×8=64要素の配列と見なすことが出来ます。これを最終的に10個の要素の配列にします。そのうちのどれかが1になります。

これを多重に行っていきます。一番最初が入力層、最後が出力層と呼ばれます。中間は中間層(隠れ層)と呼ばれます。この中間層を大量に設けて処理するのがディープラーニングです。