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

2023年11月19日

ニューラルネットワークによる翻訳を最初に知ったのはグーグル翻訳で採用した記事を見たのが最初だと思う。ググるとグーグルは2016年9月に発表している1

この時はニューラルネットワークによる翻訳がどういうものか、実を言えばさっぱりわかっていなかった。今でも正しく理解できているかというと怪しいのだが、コンピュータによる翻訳の世界に極めて大きなパラダイムシフトが起こったそのエッセンスについて頑張って話してみようと思う。

一般的にコンピュータに何かをさせようとする場合、プログラムを作成する。例えば正弦曲線(サインカーブ)を描くプログラムをpythonで書くと次のようになる。

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, np.pi*2, 0.1)
y = np.sin(x)
x = (x-np.pi)/np.pi

plt.plot(x, y)
plt.show()

プログラムを実行すると次のグラフが表示される。

三角関数のグラフog:image / twitter:imageog:image / twitter:image

それでは、同じことをニューラルネットワークに行わせようとするとどうなるのだろうか。そのためにはこれまで持っているプログラミングという概念を離れて、ニューラルネットワークの基本的な所から押さえていく必要がある。

ニューラルネットワークを日本語に翻訳すると神経網となる。これは神経細胞が複数繋がったものだ。イメージはこんな感じ。

神経網とは

出典:神経細胞のおはなし

ニューラルネットワークによるプログラミングとは、こういった神経細胞の集まりをコンピュータ上に作って、その集まりを正しい動作を行えるように教育するという流れになる。

コンピュータ上に神経細胞を作る

コンピュータ上に神経細胞を作る場合は、神経細胞(ニューロン)が持つ機能をモデル化する必要があるが、一般的には次のような感じである。

神経細胞のモデル

出典:ディープラーニングにおける活性化関数をPythonで作る!

ポイントは、神経細胞とは複数の入力をもとに、一つの出力を行うものであり、その中心は活性化関数である。重みとはそれぞれの入力値を調整するためのものであり、バイアスは入力全体を調整するためのものである。つまり、神経細胞のモデルで一番重要なのは活性化関数ということになる。

活性化関数とは何か?

神経細胞の動きを模したものが活性化関数ということになるわけだが、それはどんなものだろうか。その基本はシグモイド関数と呼ばれるものである。

出典:シグモイド関数

これは、階段関数と呼ばれる0から1に急激に変化する次のグラフ

階段関数のグラフ

をもう少し緩やかに変化するようにした感じだろうか。

いずれにしても神経細胞の核はこのシグモイド関数ということである。

そしてニューラルネットワークとは、シグモイド関数を核に持つ神経細胞をモデル化したものの集まりということになる。

余談:階段関数と計算機

階段関数とは、0から1に急激に切り替わる関数だけど、階段関数の動きを模した電子部品がスイッチ素子であり、代表的なものがリレーである。

リレー

出典:Omron リレー 5V dc, 1c接点 基板実装タイプ

リレーを使うと、例えばボタンを押すと電灯が点き、もう一度ボタンを押すと電灯が消えるというような仕組みを簡単に作ることができる2

このリレーを複数組み合わせることでコンピュータの元とも言える計算機を作ることができる。ググると、1962年にカシオ計算機が発売したリレー式計算機AL-1型が見つかった。

出典:リレー式計算機 AL-1 型

今でいう電卓の元となるような機械である。したがってこれだけ大きくても大したことはできない。とはいえ、階段関数を組み合わせるだけでも比較的複雑な動作を行わせることができることがわかるだろうか3

ニューラルネットワークで三角関数の演算を行う

神経細胞単体ではシグモイド関数一つだけだから、そこまで大したことはできないように思われる。それでは三角関数の演算を行うには神経細胞がどの位必要なのだろう。『はじめてのディープラーニング』という本には、5つの神経細胞からなるニューラルネットワークによる三角関数の演算例が載っている。以下は、そこからの私なりの抜粋である4。まず、5つの神経細胞は次のように配置する。

出典:はじめてのディープラーニング p.175

入力層の神経細胞は受け取った入力を中間層に渡すだけで、シグモイド関数が活用される神経細胞は中間層と出力層の合わせて4つとなる。神経細胞がただ配置されただけの、この段階では、入力として何らかの数値を入れても、求められる出力結果は得られない。

そこで、ニューラルネットワークを正しく動作するようにするためにまず最初に行うことは、とりあえず何らかの入力を行い、出力結果が求められる結果と異なる場合は、出力層、中間層にある神経細胞の重みやバイアスの調整を行う。これをバックプロパゲーションと呼ぶ。

例えば、次のような調整用データを用意する。

X:-1.000 Y:0.0000
X:-0.968 Y:0.0998
X:-0.936 Y:0.1987
X:-0.905 Y:0.2955
X:-0.873 Y:0.3894
     ︙
X:0.846 Y:-0.4646
X:0.878 Y:-0.3739
X:0.910 Y:-0.2794
X:0.942 Y:-0.1822
X:0.974 Y:-0.0831

まずは、調整用データからランダムに入力データ(X)を抜き取りニューラルネットワークに入力する。一通り抜き取った段階での出力(Y)は次の通り。

破線部分が正しい出力で、+部分が実際の出力である。見ての通り全くのバラバラである。この結果と正しい解答との差を見ながら、調整(バックプロパゲーション)が行われる。

以上の手順を何度も繰り返すことでニューラルネットワークを調整していく。

この一連の手順を200回繰り返したときの出力は次の通り。

正しい出力に近づいてきた。このニューラルネットワークに入力と出力の正しい関係を覚えさせることは、学習と呼ばれており、一般に調整用データの事を教師データと呼ぶ。

以下に更に200回ずつ繰り返した後の出力を示す。グラフの下にあるEpoch:の右にある数字は、繰り返した回数である。

1000回繰り返すと正しい出力とほぼ同じような出力が得られるようになった。つまり、正弦関数の演算を行うニューラルネットワークの完成である。このニューラルネットワークは入力に対する正弦関数を実行し、その結果を出力する。神経細胞5つからなるとても小さなニューラルネットワークでもこの程度のことが行えることがわかる。

拙い説明で申し訳ないが、ニューラルネットワークについての説明はこれで終わりである。ニューラルネットワークがどういうものか伝わっただろうか。

次回はいよいよ本丸のニューラルネットワークによる翻訳である。

脚注

  1. A Neural Network for Machine Translation, at Production Scale
  2. リレーって何? リレー入門講座にリレーの働きを示す、わかりやすいgif画像がある。
  3. このあたりのことに興味があれば、コンピュータはどうやって動くのか? – 国立情報学研究所に詳しい説明がある。
  4. 私なりに理解した所を書いているため、間違って理解している所があるかもしれない。興味がある方は、是非とも『はじめてのディープラーニング』を購入してほしい。

翻訳

Posted by 管理者