コンテンツにスキップ

1 ディープラーニング

1.1 環境の準備

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

pip install tensorflow

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

ニューラルネットワークとは、人間の脳の神経細胞(ニューロン)の動作を参考に作られた計算モデルです。

ニューロンは複数の入力信号を受け取り、それらの総和が閾値を超えると出力信号を発火します。

パーセプトロンはこれを模した簡単なモデルで、入力データにある数を掛けます。これを重み付けといいます。それらを合計し、バイアス以上であれば 1 を、そうでなければ 0 を出力します。

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

deep_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にします。

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

1.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層目: NANDゲートとORゲートで出力を計算
    nand_output = nand_gate(x1, x2)
    or_output = or_gate(x1, x2)

    # 2層目: NANDゲートとORゲートの出力をANDゲートに統合
    xor_output = and_gate(nand_output, or_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

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

1.4 ディープラーニング

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

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

ニューラルネットワークでは、学習データを使い、正解との誤差を最小化するように重みとバイアスを調整します。この作業が「学習」です。

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

画像はピクセル値の行列(数値配列)として表現でき、例えば 8×8 のグレースケール画像なら64個の数値で表されます。これを入力として、最終的に 10 個の要素を持つ出力(数字0~9の確率)を得ることができます。

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