ITと哲学と

IT系エンジニアによる技術と哲学のお話。

第3回 大阪大学人工知能研究会にお邪魔してきた

第3回 大阪大学人工知能研究会にお邪魔してきました。

大阪大学人工知能研究会 | AIR at Osaka University - 第3回 大阪大学人工知能研究会「Deep Learning...

人工知能の勉強会で、関西から日本の人工知能研究を牽引したいというような思いで勉強会を立ち上げたとのことで、今回は色々と話題のDeepLearningの入門的な講義を聞くことができました。

講義をしていたのはなんと学部4年の方でしたが、かなり堂々と講義されておりすごい立派だなーと思いながら見てました。

内容はニューラルネットワークについてで、単一のパーセプトロンを用いた学習から多重パーセプトロンを用いた学習、そして深層学習へ、といったストーリーでした。

講義メモを取りながら聞いていたのそのまま貼り付けようと思います。

次は中級編的な内容もやりたいと思っているとのことだったので楽しみです!

結構踏み込んだ内容も多かったように感じましたが、なかなかに興味深い時間を過ごすことができました。

以下講義メモ

機械学習の基本的な知識

機械学習とは

データの集合から法則性を学ぶこと。 どんな法則性か?で色々と分けることができる。  回帰とか分類とかクラスタリングとか異常値とか

ルールベースで分けたらええんちゃうの?  =>ルールを作るのが難しいねん。それを機械学習ではデータをもとに勝手にやってくれるねん。すごいねん。

パーセプトロンとは?

順伝搬とは

人間の脳を模倣できるモデルを作るのがニューラルネットワークの発祥。 シナプスを模倣したものがパーセプトロン

複数の入力を受け取って、何らかの出力をする。 その際に入力から出力方向へ一方向へデータが流れ、逆流はしない。 これを順伝搬という。

入力データXと重み関数Wを使って、内部状態はXWの内積で求まり、これらの内部状態に活性化関数を適用して出力値が決まる。 sigmoid関数であれば内部状態の値によって0~1の状態を取る。

学習について

与えられたデータをもとに、望ましい出力が得られるようにモデルを改変することを学習という。 重み関数Wとバイアスがパラメータになる。

学習を複数データに繰り返していくことで、重要な情報とそうではない情報を見極めるモデルを構築することができる。

パーセプトロンの学習則を日本語で説明すると新しい重みは、古い重みを、一定の割合で、教師データと出力データの差分を、関与した分だけ更新すると言い表すことができる

単純なパーセプトロンでは線形分離可能な問題を解くことができる。  =>直線的な線で境界を引くことができるような分類問題のこと。

多層パーセプトロン

パーセプトロンをくっつけて、神経網を模したモデルを作る。これを多層パーセプトロンという。

入力層

inputデータの構造に合わせて形状が決まる。 1入力が1ノードに入る構造になる。

中間層

ノードのパラメータが色々とある。 パラメータの選択は結構難しくて職人技になっている。これを自動化したいという研究もある。

出力層

分類問題であれば、分類したいクラスの数だけノードを用意する。 出力関数は一般的にソフトマックス関数になる。

回帰問題であれば出力したい値を1つ出すノードを1つ用意する。

扱いたい問題を理解して、それに合わせた構造を作ることが大切。

多層パーセプトロンの学習について

与えられたデータをもとに、望ましい出力が得られるようにモデルを改変する。

学習には「損失関数」を用いる。

出力データと教師データがどれだけ違うかを示したもの。 問題によって損失関数を決める。 例えば回帰であれば二乗誤差だったり、多クラスの分類問題であれば交差エントロピーだったりする。 なんにせよ、出力と教師データをできるだけ似せたいので、損失関数を最小化することが大切。

具体的な学習は勾配降下法を使って学習していく。 損失関数が下に凸の関数であれば勾配降下法で最適解まで行ける。 局所解を持つような損失関数であれば、そこに落ち着いてしまうこともある。

勾配計算について

教師データと推定結果の差を計算するわけなので、出力層の勾配計算は簡単にできる。教師データがあるわけだから。

ではそれがない中間層はどうしたら良いか?中間層の理想的な値はわからんよ?

その場合には誤差伝搬法を使う(逆伝搬)

あるべき値と学習データの差をデルタと呼ぶと、前の層のデルタは、次の層のデルタを結合で集約したものに、活性化関数上の自分の値を微分した値をかけることで求めることができる。 ここで微分を計算する必要があるので活性化関数は微分可能な関数を用いる。ヘブサイド関数は使わないでsigmoid関数とかを使う。

確率的勾配降下法とは?

全データを使った学習を行うと、局所解に陥って局所解に陥ることがある これを避けるのが確率的勾配降下法

全訓練データをミニバッチに小分けして学習する。 こうすると損失関数の形状がミニバッチの選び方によって若干変わるので、局所解に陥る可能性を下げることができる。

モデル評価

訓練データで学習させて、未知のデータを推論させる。 なので、得られる教師データの全てを学習データにしたらいけない。評価のためのデータは取っておくこと。

多層パーセプトロンの問題点

中間層を増やしてみると、うまく学習ができない。。。と言う問題があった。 初期値がうまく設定できていない例は以下にある。 W1とW2の初期値をいい感じで設定する必要がある。 この例では初期値は正規分布に従う乱数でも事足りるが、さらに多層になっていくとそれでも全く学習がうまくいかなくなる。

GitHub - masamasah/perceptron: 第3回 大阪大学人工知能研究会で学んだ多重(2重)パーセプトロンを用いたMNISTデータ学習のサンプル

これを引き起こしていた問題は2つある

勾配消失問題

ニューラルモデルを深層にすると、勾配がめちゃめちゃになるので学習が適切に行われなくなる問題が起きていた。  =>つまり重みが適切に計算できないということ。劣決定問題的なイメージかな?と講義を聞いてて思った。

過学習問題

訓練データに追従しすぎてテストデータに対して良い精度が得られない問題。 不必要に高次元な関数によるフィッティングになりすぎてしまうことがあるっぽい。

訓練データをできるだけたくさん用意することで過学習問題を緩和できる。

DeepLearningの始まり

各層の初期値をいい感じにすると過学習問題が解消できるということから深層学習いけるやん!ってなった。 いい感じにするには?事前学習ということを行って初期値をいい感じにしておく。 これには確率的・決定論的2つの方法がある。

今回の講義では決定論的な方法を説明する。

決定論的な方法

自己符号化器というやつ。 自分自身を再現できるようにモデルの学習を進める。 特徴表現学習とも呼ぶ。

この初期値を使うことで、情報をうまく伝搬しやすい重みの初期値を得ることができる!

各層についてそれぞれ事前学習を行うことで全ての層の初期値を効果的に得ることができる

畳み込みニューラルネットワーク

いろいろなニューラルネットワークがあるが、その中で結構有名なニューラルネットワークはこれ。

畳み込みニューラルネットワークは、人間の視覚野を模擬した構造を持っている。 画像認識に特化したモデルであると言える。

畳み込みニューラルネットワークはDeepにしても事前学習が不要という利点がある ただし、学習にとっても時間がかかる。GPUの計算リソースは必須。