SlideShare a Scribd company logo
1 of 132
深層学習
(前編1、後編1、後編2)
HIROKI SANO
これは
istudy Academy 現場で潰しが効く
ディープラーニング講座の
終了課題レポートです。
URL:http://study-ai.co.jp/jdla/
DAY2
Section1)勾配消失問題
【確認テスト】
連鎖律の原理を使い、dz/dxを求めよ。
※uはxにつられて動く、yはuにつられて動く⇒合成関数
※連鎖律とは複数の関数が合成された合成関数を微分するとき、
その導関数がそれぞれの導関数の積で与えられるという関係式
勾配消失問題
• 勾配消失問題・・・出力層から入力層にかけて勾配が緩やかに
なるため、更新がかけられなくなり、
最適値に収束しなくなること。シグモイド
関数の課題。
可視化するとこの問題が発生している
かがわかる。
【確認テスト】
シグモイド関数を微分した時、入力値が0の時の最大値は?
⇒0.25
⇒(1-Sigmoid(u))×Sigmoid(u)⇒(1-0.5)×0.5=0.25
※入力値が0の時は、グラフより0.5で最大値を取る。
勾配消失問題のビジョン
• Sigmoidを微分した値は最大でも0.25。それが伝播していくとこれがどん
どん少なくなっていく。
⇒ソリューションは3つ
・活性化関数の選定⇒ReLU関数を使う。
今最も使われている。閾値を設けて、それを超えた場合は
そのまま値が変えるため、回避できる。
・重みの初期値設定
①Xavier(ザビエル)
⇒重みの要素を前の層のノード数の平方根で除算した値を初期値として
設定する。
⇒Xavierで初期値を設定するのは、ReLU関数、シグモイド(ロジスティッ
ク)関数、双曲線正接関数(ハイパボリックタンジェント)の3つが多い。
重みの初期値設定
• 重みの初期値設定
②He ⇒重みの要素を前の層のノード数の平方根で
除算した値に対し、√2を掛け合わせた値
⇒ReLU関数に特化した関数
【確認テスト】
重みの初期値に0を設定すると?
⇒何を掛けても0のため更新がされない。
【正解】すべての値が同じ値で伝わるため、パラメータの
チューニングが行われなくなる。
バッチ正規化
• バッチ正規化(2015年に提唱された)
⇒活性化関数に値を渡す前後でバッチ正規化層を追加し、バッチ正規
化の処理を行うことで、ミニバッチ単位で入力値のデータの偏りを抑
制する手法。uまたはzを入力値とする。
⇒今も研究が盛んにおこなわれている。
【確認テスト】
一般的に考えられるバッチ正規化のの効果2つ
①勾配消失問題を抑制する。
②中間層の学習を安定化させる(隠れ層の学習で入力分布をガウス分
布に変換し、入力データを制限することで、入力データががくしゅう
のたびに大きく変わることを防ぐ)
⇒【正解】計算の高速化(データのばらつきが抑制されるため )
バッチ正規化
• スケーリングパラメータとシフトパラメータを学習していく。
【順伝播の場合】
勾配消失
シグモイド関数
勾配消失が起きている状態。収束
していない。
ReLU関数
勾配消失が起きていない。
学習がすすんでいる。
勾配消失
シグモイド関数+Xavierで初期値を設定。
学習が進んでいる。
初期値の設定は重要となる。
ReLU関数+He関数
勾配消失が起きていない。
一機に学習がすすんでいる。
隠れ層のレイヤーサイズ変更(100に設定)
シグモイド関数
⇒変化なし
ReLU関数
⇒学習が早まった。
関数の変更
ReLU関数+Xavierで初期値を設定。
勾配消失は起きていない。
シグモイドより早く学習が進んでいる。
シグモイド関数+He関数
多少の学習は進むが勾配消失が
起きており、収束していない。
データについて
データは少ないため、集める必要がある。(ニーズがある)
(例)たくさんの顔画像を集める方法
⇒顔分析サービスを作って、ユーザが顔写真を入力してくれる
ため、データが集まる。
⇒データを集めるためにプロダクトを作ってみる。
• データの扱い方
⇒日本はデータの扱いがルーズになっているところがあるため、
法整備が済む前にデータを集めておくことが得策
学習率最適化手法
• 学習率の値が大きい場合は、発散して収束しない。
• 学習率の値が小さい場合は、収束までに時間がかかる。
局所的最適値に収束してしまう。
⇒学習率はどのように設定するか?
⇒最初は大きくしておいて、徐々に小さくしていく。
⇒パラメータ毎に学習率可変させる。
などがあるが、自動で学習率を最適化させる手法がある。
学習率最適化手法
①モメンタム
・・・誤差をパラメータで微分したものと学習率の積を減算
した後、現在の重みに前回の重みを減算した値と慣性
の積を加算する。
⇒局所的最適解にならない。
⇒勾配が緩やかになってから
最適値になるまで時間が早い。
⇒前回の重みが次の重みの
影響を受けるため。
※慣性は0.9がデフォルト(0.5~0.9で調整する。
学習率最適化手法
【確認テスト】
モメンタム・AdaGrad・RMSPropの特徴
モメンタム・・・パラメータの最小値を物理法則(ボールが凹みに転がる
イメージ)的なアプローチで収束させる。谷間に落ちてからの収束が早い。
AdaGrad・・・モメンタムの凹みに近づいた時の振れ幅を小さくするよう
に学習係数を自動で調整する。早い段階で高い精度を出しやすい。ただし、
初期学習係数を決める必要がある。緩やかな斜面でも最適値に近づきやす
い。
RMSProp・・・3つの中で一番新しく、AdaGradを改良したもの。より直
近の勾配情報を優先して計算するように変更されている。パラメータの調
整が少なくてよい。
学習率最適化手法
AdaGrad
・・・誤差をパラメータで微分したものと再定義した学習率の積
を減算する。Θを使うのは分母を0にならないようにしている。
⇒勾配の緩やかな斜面に対して、
最適値に近づける。
⇒学習率が小さくなるにつれて、
鞍点問題を引き起こすことが
あった。(収束したと思ったが
片方は極大値だった。)
学習率最適化手法
• RMSProp
・・・誤差をパラメータで微分したものと再定義した学習率を減
算する。
⇒局所的最適解にならない。
(AdaGradとの対比)
⇒ハイパーパラメータの
調整が少ない。
学習率最適化手法
• Adam
・・・過去の勾配の指数関数的減衰平均(モメンタム)、パラ
メータの自動調整(RMSProp)の良いところを持った最適化ア
ルゴリズム。多様されている。
実装方法(MomentumをもとにAdaGradを作ってみよう)
• Momentum
# ===========================================
if i == 0:
h[key] = np.zeros_like(network.params[key])
h[key] = momentum * h[key] - learning_rate * grad[key]
network.params[key] += h[key]
# ===========================================
• AdaGrad
# ===========================================
if i == 0:
h[key] = np.full_like(network.params[key],1e-4)
else
h[key] += np.square(grad[key])
network.params[key] += learning_rate * grad[key]/(np.sqrt(h[key]))
# ===========================================
実装方法
RSMProp
learning_rate_t = learning_rate * np.sqrt(1.0 - beta2 ** (i + 1)) / (1.0 - beta1 ** (i + 1))
for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
if i == 0:
m[key] = np.zeros_like(network.params[key])
v[key] = np.zeros_like(network.params[key])
m[key] += (1 - beta1) * (grad[key] - m[key])
v[key] += (1 - beta2) * (grad[key] ** 2 - v[key])
network.params[key] -= learning_rate_t * m[key] / (np.sqrt(v[key]) + 1e-7)
if (i + 1) % plot_interval == 0:
accr_test = network.accuracy(x_test, d_test)
accuracies_test.append(accr_test)
accr_train = network.accuracy(x_batch, d_batch)
accuracies_train.append(accr_train)
Adam
h[key] = np.zeros_like(network.params[key])
h[key] *= decay_rate
h[key] += (1 - decay_rate) * np.square(grad[key])
network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]) + 1e-7)
RSMPropの初期値の変更
learning_rate = 0.01
decay_rate = 0.99
learning_rate = 0.1
decay_rate = 0.99
learning_rate = 0.01
decay_rate = 0.50
learning_rate = 0.01
decay_rate = 1.2
learning_rate = 0.001
decay_rate = 0.99
初期値は大きくても小さくても
うまく学習できない。
特にdecay_rateは大きくすると
学習できないため、1以下にする。
シンギュラリティ
• 2045年 技術的特異点⇒技術革新でAIにとって代わる。
• スウェーデンではマイクロチップを体に埋め込んで決済できる人もい
る。
• 日本でも全能アーキテクチャーという学会でドラえもんのようなもの
を作るような動きも活発化
• AIは欲がないためどうしたいという気持ちを自発的に持つことができ
ない。
• 現在では前頭葉、海馬、大脳、小脳などのパーツはできているが、
• それを組み合わせて意思決定をするまでに至っていない。
• 今後も世界でこの欲についての議論が活発化する。
• 結果として、シンギュラリティよりも前にできる可能性もあり。
⇒AIの知識や情報を取得し、勉強に生かしていく。
過学習
• 過学習・・・特定の訓練サンプルに特化して学習してしまう
ことにより、テスト誤差と訓練誤差が乖離する。
原因⇒パラメータの数、値、ノードの数が適切ではないなど
⇒上記をまとめると、ネットワークの自由度が高い状態
解決策 ⇒ネットワークの自由度を制約する(ルールを作る)
⇒正則化手法を利用する。
正則化手法 ⇒L1正則化、L2正則化、ドロップアウト
【確認テスト】リッジ回帰の特徴
⇒(a)ハイパーパラメータを大きな値に設定すると、
すべての重みが限りなく0に近づく
Weight decay(荷重減衰)
• 重みが大きい値を取ることで過学習が発生すること。
⇒重みが大きいと重要な値となり、過学習が起きる。
解決策⇒正則化項を加減することで重みを抑制する。
つまり、かがくしゅうが起こらないように重みを
コントロールし、かつ重みのばらつきを出す
⇒この手法が正則化手法となる。
L1正則化、L2正則化
• L3、L4などがあるの
か・・・実務の世界で
はある。
• Weight_decay_
lambdaは任意の数字。
誤差に加算される。
確認テスト
• L1正則化を表しているグラフは?
• L1は0の値を取ることが可能のため、スパース化の問題に対応している。
• L2は計算リソースを使える場合は、使ったほうが良い。
例題チャレンジ1
• 解答⇒(4)Param
L2ノルムはparam
の二乗だが、
係数2は正則化
の係数に吸収され
ても変わらない
ため、ただの
paramが正解
例題チャレンジ2
• 解答⇒(3)sign(param)
L1はparamの1乗のため
絶対値の微分を取る。
⇒Signは符号関数
(0以上なら1、
ゼロならゼロ、
マイナスなら-1)
例題チャレンジ3
• 解答⇒(4)
[]内は縦、横、チャネル
となっている。
縦横は定義しているが、
チャネルは定義して
おらず自由なため、
:のみとなる。
ドロップアウト
• 正則化で一番多く使われている。
• ランダムにノード削除してノード数が多い課題を回避
⇒閾値を超えない場合は、無効化する。
⇒データ量を変化させずに、異なるモデルを学習させる。
• テンソルフローとチェイナーはやり方は異なるがドロップアウ
トの閾値を設けている可能性あり。
(普段はこのようなライブラリを使うことが多い。
特別なことをする場合は、Numpyで組んだりする。)
• CNNはデータの偏りがあるため、ドロップアウトが多用される。
実装演習
• L2正則化でweight_decay_lambdaの値を変更する。
⇒数字を小さくすると強度が弱くて過学習が起こる。
⇒数字を大きくすると早めに収束してしまって、正しく学習できない。
⇒これはデータセットにも可変するため、感覚を覚える。
Weight_decay_lambda=0.005 Weight_decay_lambda=1
学習できていない
過学習が発生している。
実装演習
use_dropout = True
dropout_ratio = 0.15
use_dropout = False
dropout_ratio = 0.15
use_dropout = True
dropout_ratio = 1
SGD(learning_rate=0.01) AdaGrad(learning_rate=0.01)
Momentum
(learning_rate=0.01, momentum=0.9)
良い 過学習 未学習
過学習 過学習
過学習
実装演習
Adam() Dropout + L1
うまく学習できている過学習
畳み込みニューラルネットワーク(CNN)
• 構造例
• 画像で良い結果を出している。
• 畳み込み層、プーリング層の数は任意
• 最後は全結合層⇒出力層
• LeNetの構造が元となっている。
畳み込み層
• 入力層(数値)⇒フィルター(重み)⇒出力値+バイアス
⇒活性化関数 ⇒出力値
全結合層での学習⇒入力値(画像のドット)⇒中間層⇒
⇒出力層(数字で行ったら10個)
・畳み込み層 ⇒3次元の空間情報も学習できるような層
(画像の縦、横、チャネルの3次元、RGB等)
・演算概念⇒フィルターを掛け合わせて足し合わせる
⇒出てきた数値にバイアスを足されて出力
畳み込み層の登場人物
• 入力画像4×4⇒出力画像2×2 ⇒出力画像が小さいけ
ど・・・大丈夫か・・・?
• パディング⇒入力画像を大きくして固定データを埋める。
⇒数値は任意で入れられるが、ランダムに入れるとおかしい画
像になる可能性があるため、影響が少ない「0」を入れることが
一般的。
• 画像を小さくする時のどこからどこまでを1つととらえるか、
何個分スライドさせるか⇒ストライド
• 空間的な相関を学習するときに増やした層のことをチャンネル
という。RGBの各チャネルの関係性を学習に反映させる。
実装演習
transposeの処理をしている行
をコメントアウト
サイズやフィルターサイズ・ストライド・
パディングの変更
Im2col、col2im
Im2col・・・多次元配列を2次元配列にするメソット
例) 3×3 ⇒ 9の要素×奥行
⇒1列に数値化し、奥行の分だけの列を作る。
メリット:行列計算に落とし込むことで多くのライブラリ
を活用できる。
col2im・・・2次元配列を画像データにするメソット
※im2colとcol2imのメソットは全く違うため、
多次元⇒2次元⇒多次元 としても別のものが出る。
プーリング層
• マックスプーリング、アベレージプーリングがある。
⇒入力画像の対象領域のMax値、または平均値を取得
⇒両方のやっていることは変わらない。
【確認テスト】
サイズ6×6の入力画像をサイズ2×2のフィルタで畳み込ん
だ時の出力画像のサイズは?スライドとパディングは1
OH⇒H+2P-FH +1 OW= W+2P-FW +1
S S
⇒7×7
畳み込みの演習
• 処理はかなり時間がかかった。
• 可変値を変換してみたが、
• まだどこがどのように影響
• しているのかが分かりにくい。
シラバス
• Deep Learning(Goodfellow他著)に則って、抜粋や追加されて出題され
る。
• 応用数学は、講義の内容を理解していれば問題ない。
⇒しっかり手を動かして答えられるようにする。
• 偏微分はシラバスに含まれていないが、誤差逆伝播法で用いるため、必須。
• 機械学習は網羅的に出題される。一般的な話は必ず押さえる。
• NNは微積分の連鎖率が基本であり重要。
• 正則化は講義の内容以外からも出題されるから自己学習が必要。
• 最適化(学習率やパラメータなど)は基本的なアルゴリズム。
• CNNは畳み込み処理、プーリングは最重要。
• RNNは数学的に複雑になり重要なため、自己学習が必要。
⇒実務ではTensorFlow、Keras、Chainerなどライブラリーを活用する。
• 生成モデル、強化学習は難易度が高いが、概念だけはつかんでおく。
最新のCNN(AlexNet)
• AlexNet・・・2012年に開かれた画像認識コンペティションで2
位に大差をつけて優勝した、ディープラーニングを利用したモ
デル。
⇒モデルの構造は、5層の畳み込み層及びプーリング層など
それに続く3総の全結合総から構成される。
⇒サイズ4096の全結合総の出力にドロップアウトを使用して、
過学習を抑制している。
クローラー
• (検索は英語でやったほうがヒットしやすい。⇒能力鍛え
る。)
• 手元にデータがない場合はクローラーを作ってみる。
⇒データベースの知識がない場合などに、CSVとして出力
できるため、有効。
• タイムスリープをしっかり入れないとはじかれる。
⇒5秒ごとに取る、でもはじかれることがあるため、ランダム
にスリープするとうまくいくことがある。
【確認テスト】サイズ5×5 フィルタ3×3、S2、P1
⇒(5+2×1-3)/2+1 =3 H、W同じ
DAY3
Section1)RNN
RNNとは・・・時系列データに対応可能なNN。時系列の意味を
踏まえたまま計算ができる。
⇒時系列データは相互に統計的依存関係が認められる
データを前提
⇒中間層(隠れ層が)とても重要
【確認テスト】
RNNのネットワークには、大きく分けて3つの重みがある。
1つは入力から現在の中間層を定義する際にかけられる重み、
1つは中間層から出力を定義する際にかけられる重み。
もう一つは?
⇒中間層から次の中間層に渡されるときにかけられる重み。
RNNの特徴・・・前の層から次の層に状態を保持しつつ、
再帰的に求めていく。
実装演習(バイナリでの加算)(パラメータ変更)
weight_init_std = 1
learning_rate = 0.1
hidden_layer_size = 16
weight_init_std = 10
learning_rate = 0.1
hidden_layer_size = 16
weight_init_std = 1
learning_rate = 0.001
hidden_layer_size = 16
weight_init_std = 1
learning_rate = 0.1
hidden_layer_size = 100
パラメータのチューニングは勘が必要で、
いろいろやってみて、つかめるように
なるしかない。
実装演習(重みの初期化方法を変更)
# Xavier
W_in = np.random.randn(input_layer_size, hidden_layer_size) / (np.sqrt(input_layer_size))
W_out = np.random.randn(hidden_layer_size, output_layer_size) / (np.sqrt(hidden_layer_size))
W = np.random.randn(hidden_layer_size, hidden_layer_size) / (np.sqrt(hidden_layer_size))
# He
W_in = np.random.randn(input_layer_size, hidden_layer_size) / (np.sqrt(input_layer_size)) *
np.sqrt(2)
W_out = np.random.randn(hidden_layer_size, output_layer_size) / (np.sqrt(hidden_layer_size))
* np.sqrt(2)
W = np.random.randn(hidden_layer_size, hidden_layer_size) / (np.sqrt(hidden_layer_size)) *
np.sqrt(2)
実装演習(中間層の活性化関数変更)
Relu関数(中間層、逆伝播部分)
z[:,t+1] = functions.relu(u[:,t+1])
delta[:,t] = (np.dot(delta[:,t+1].T, W.T) +
np.dot(delta_out[:,t].T, W_out.T)) *
functions.d_relu(u[:,t+1])
tanh(ハイパボリックタンジェント)の利用
(導関数定義、中間層、逆伝播)
def d_tanh(x):
return 1/(np.cosh(x) ** 2)
z[:,t+1] = np.tanh(u[:,t+1])
delta[:,t] = (np.dot(delta[:,t+1].T, W.T) +
np.dot(delta_out[:,t].T, W_out.T)) * d_tanh(u[:,t+1])
BPTT(バックプロバケーションスロータイム)
BPTTとは・・・RNNにおける誤差逆伝播法のこと。
誤差逆伝播法の説明⇒計算結果と正解の誤差を逆算して
パラメータを更新すること。
【確認テスト】
連鎖率の原理を使いdz/dxを求めよ。
z=t 、t=x+y
⇒2t*1 =2t =2(x+y)
2
BPTT(数学的記述)
BPTT(数学的記述2)
確認テスト
z1=Sigmoid(S0W+
x1W(in)+b)
y1=sigmoid(Z1Wout
+c)
※b、cはバイアス
ビジネス事例
• インフラとしては、リソースが足りなくなるため、スペックの
高いサーバやGPUを使うことが多い。
⇒ビジネスとしては、AIサーバやクラウドなどの製品、
サービスがある。
• AIエンジニアがその基礎を理解していれば、そのAIをどう使う
かだけになる。
• ユーザ自信が幸福になるようなAIの使い方を考える。
BPTT(数学的記述3、4)
BPTT(数学的記述3、4)
BPTTコードきさい方法
• 実際にはこのように書ける
コード演習問題
答え:(2)
⇒Uの内積を取る。
⇒RNNでは過去の
中間層出力が存在
⇒過去の中間層で
現在の中間層を
微分した値はUと
なる。
RNNの課題
• 時系列をさかのぼるほど勾配消失
⇒長い時系列の学習が困難
解決策 ⇒RNNの構造自体を変えて出来上がったのがLSTM
重みの初期値の設定や活性化関数を変える、などの
勾配消失問題解決とは全く異なる。
勾配消失問題とは・・・誤差逆伝播法でさかのぼるほどに、勾配
が緩やかになり、パラメータの更新が
小さくなり、収束しなくなる。
【確認テスト】シグモイド関数の入力値が0の時の最大値は?⇒0.25
勾配爆発
• 勾配爆発・・・勾配消失の逆。逆伝播するごとに指数関数的に
大きくなり、収束しなくなる。
【演習チャレンジ】
解答:(1)
⇒勾配の閾値を超えなかった
場合は、閾値が掛け合わされる
のみとなる。
LSTMの全体図
CEC
• 勾配消失及び勾配爆発の解決方法。勾配が1であれば解決できる。
• これに勾配が1になり続けて勾配爆発は起きなくなる。
• 課題)時間の依存度に関係なく重みが一律である。
⇒学習特性がなくなる⇒重み衝突という。
⇒入力ゲートと出力ゲートで解決させる。
入出力ゲート・忘却ゲート
• 入力、出力時に入力値の重みを可変可能とする。
⇒CECの課題を解決。
LSTMではCECで過去の情報がすべて保管されている。
⇒過去の情報から影響を受け続ける。
解決策)要らなくなった過去の情報を、忘却させる。
⇒忘却ゲート
【確認テスト】「映画面白かったね。ところで、とてもおなかがすい
たから何か・・・
⇒とても、は忘却ゲート!
演習チャレンジ
解答:(3)
⇒1つ前のインプッ
トと、毎回忘却ゲー
トを掛け合わされる
ため。
覗き穴結合
CECの過去情報を任意のタイミングで他のノード伝播や忘却させ
たい。CEC自身の値は、ゲート制御に影響を与えていないため。
⇒覗き穴結合を利用・・・CECの値に重み行列を介して伝播
可能にした構造のこと。
GRU(Gated Recurrent Unit)
LSTMはパラメータが多く、計算負荷が高い。
⇒精度は同等またはそれ以上となる構造にして、
パラメータを大幅に削減
⇒GRU⇒計算負荷が低い。
【確認テスト】
課題を述べよ。
LSTM⇒パラメータが多く、
計算負荷が高い
CEC⇒重みが一律のため、
学習特性がなくなる。
演習
解答(4)
次に渡される中間状
態は1ステップ前の中
間表現と計算された
中間表現の線形和で
表現される。
確認テスト
• LSTMとGRUの違い。
⇒LSTMはパラメータが多く計算負荷が高いが、GRUはパラメー
タを少なくし、かつ精度を同等または同等以上が期待できる構造
としている。
補足)実務ではどちらも走らせて、結果を見て採用を検討する。
双方向RNN
過去だけではなく、未来の情報を加味することで精度向上させる
ためのモデル。
【演習チャレンジ】
解答)(4)
双方向RNNでは、順方向
と逆方向に伝播した時の
中間層表現を合わせたも
のが特徴量となる。
Section5) Seq2Seq
Seq2Seq・・・機械対話や機械翻訳などに使用される、
Encoder-Decoderモデルの一つ。
Encoder RNNとは・・・ユーザがインプットしたテキストデー
タを単語などのトークンに区切って渡す。
Taking:文章を単語などのトークンに分割しIDを付与
Embedding:IDからそのトークンを表す分散表現ベクトルに
変換。
Encoder RNN:ベクトルを順番にRNNに入力する。
Encoder RNN処理手順
①vec1をRNNに入力し、hidden stateを出力
②①を次の入力vec2などに繰り返す。
③最後のvecを入れた時のhidden stateがfinal state
(thought vectorと呼ばれる)となり、入力した分の意味を
表すベクトルとなる。
Decoder RNN
システムがアウトプットしたデータを単語などのトークンごとに
生成する。
【処理】
①Encoder RNNのfinal state(thought vector)をinitial sttate
として設定し、Embeddingを入力。
②Sampling:生成確率に基づいてトークンをランダムに選ぶ
③Embedding:②のトークンをEmbeddingして次の入力にする。
これを繰り返す。
④Detokenize:繰り返したトークンを文字列に直す。
確認テスト
解答(2)
演習チャレンジ
解答)(1)
⇒正解は不明
HRED
• Seq2Seqの課題 ⇒一問一答しかできない。(文脈の流れを即して
答えを出すことができない。
⇒HRED・・・過去n-1個の発話から次の発話を生成
⇒前の単語の流れに即して応答されるため、より人間らしい
解答ができる。
HRED⇒Seq2Seq+Context RNN(Encoderのまとめた書く文章の系
列をまとめて、これまでの会話コンテキスト全体を表すベクトルに変
換する構造となっている。)
⇒過去の発話の履歴を加味した返答ができる。
課題)確率的な多様性が字面にしかなく、会話の流れのような多様性
がない。(質問が同じなら答えも同じ)⇒短い情報量に乏しい解答を
しがち。
VHRED
⇒VAE(ばえ)の潜在変数の概念を追加したもの。
HREDの課題をVAEの潜在変数の概念を追加することで解決
【確認テスト】3つの違い。
Seq2Seqは一問一答しかできないが、HREDは前の会話の流れ
を加味して解答できる。しかしHREDは質問が同じなら同じ解答
になってしまい、多様性がない。この解決策としてVAEの潜在概
念を追加したVHREDができ、これは異なる解答ができる。
AE(オートエンコーダ)
オートエンコーダ・・・教師なし学習で入力データは訓練データ
のみ。1つの画像を入れたら、同じ画像を出力するニューラル
ネットワーク。
画像⇒洗剤変数Zに変換⇒Encoder
潜在変数Z⇒画像に変換⇒Decoder
⇒Zの次元が入力データより小さくなるため、次元削減
が行える、というメリットがある。
牽引企業
• クラウド
⇒AWS・・・価格安く、使いやすい。
⇒GCP・・・TensorFlowなどは充実している。
• ライブラリ
⇒プリフォードネットワークスのChainer(日本産)
⇒TensorFlow(使いやすい。APIも使える)
• ハードウエア
⇒NVIDIA(GPUは強い)
⇒Google(NVIDIAのGPUは使えていない)
• ソリューション
⇒TOYOTA(自動運転)
※お金が投資されたか、などをニュースや新聞で追うとよい。
VAE(ばえ)
オートエンコーダーはデータを潜在変数Zに押し込めているが、
どのような規則で押し込めているか、その構造が分からない。
⇒VAEは確率分布をいう構造を利用してデータを潜在変数Zに押
し込めることを可能にしたもの。
⇒確率分布を利用しているため、質問が同じでも解答が異なる。
【確認テスト】
VAE⇒自己符号化器の潜在変数に確率分布を導入したもの。
Section6)word2vec
RNNでは固定長形式で単語を表す必要があったが、word2vecは
可変長の単語もNNに与えることができるようにした。
⇒学習データからボキャブラリを作成する。
今まではOne-hotベクトルでボキャブラリ×ボキャブラリのすべ
ての計算が必要であった。それをボキャブラリ×任意の単語ベク
トル次元で計算できるため、次元数を少なくして重みを生成する
ことができる。よって、リソース利用量が少なく済むため、大規
模データの分散表現が現実的な計算速度とメモリ量で学習が可能
となった。
Section7)Attention Mechanism
・・・入力と出力の単語の関連度を学習する仕組み。
Seq2Seqは文章が長くなるほど次元も大きくなる。
⇒関連度(単語の結びつき)の高いもののみを学習で利用するため、
単語数が少なく学習できるようになる。Seq2Seqにプラスして利用。
【確認テスト】2つの違い
RNNとword2vec・・・ RNNでは固定長形式で単語を表す必要があっ
たが、word2vecは可変長の単語もNNに与えることができるため次元
数を少なくし、計算速度が速い。
Seq2SeqとAttention・・・Seq2Seqは文章が長くなると次元数が多
くなり、対応が難しくなるが、Attentionは関連度を用いて単語数を少
なく学習できるため、計算速度が速い。
実務経験について
• 学習をするにはデータが必要。
⇒データがある状態で学習するほうが知見が身につく。
⇒できるだけデータが利用できるところで研究すべき。
・ユーザに対してサービスを提供する。
⇒AIだけでなく、バックエンド側の機構などの知見が身につく。
DAY4
TensorFlow
実際に実務や現場で使う時は、ライブラリーを使って実装するこ
とが多い。
中でもTensorFlowはGoogleが作ったライブラリーで利用者が一
番多い。次にKeras、PyTorchくらい。
これまでやってきた実装をTensorFlowでやってみる。
TensorFlowでは、まずセッションを立ち上げて、そのあとにス
マートにセッションをランすることで実際にTensorというもの
が動作を行う。
TensorFlowでは、デバックを行う場合、ただPrintするだけでは
Tensorが表示されるだけのため、セッションを立ち上げてから
Printする必要がある。
TensorFlow
TensorFlowの基本的な演算3つ
• PlaceHolder・・・?を入力しておくことで変数を入力できる。
あとから値を自在に変えることができる。
⇒バッチごとに変数を代入して学習する際などに利用。
• Variables・・・変数を定義する。定数ではないため、変える
ことができる(tf.assignを使う)。初期値に戻す場合は、
global_variables_initializer() を利用。
• constant・・・定数を定義
線形回帰の実装
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline #プロットはこれを記載するか2回目、3回目で表示される。
iters_num = 300 #学習回数。for分にいれる。
plot_interval = 10 #何回の学習ごとに誤差を表示するか。
# データを生成
n = 100 #100個のランダムなxを生成し、3×X+2の正解dを作っている。
x = np.random.rand(n)
d = 3 * x + 2
# 上記では一直線のデータ展開のため、ノイズを作る。
noise = 0.3 #0~0.3のノイズを作り、dに加えることでまばらな点にする。
d = d + noise * np.random.randn(n)
# 入力値(ここからTensorFlowの実装)
xt = tf.placeholder(tf.float32) #変数を指定して後ほど代入して学習する。
dt = tf.placeholder(tf.float32)
# 最適化の対象の変数を初期化
W = tf.Variable(tf.zeros([1]))#初期値0のウェイト
b = tf.Variable(tf.zeros([1]))#初期値0のバイアス
y = W * xt + b #wとbを学習で求める。
# 誤差関数 平均2乗誤差
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline #プロットはこれを記載するか2回目、3回目で表示される。
iters_num = 300 #学習回数。for分にいれる。
plot_interval = 10 #何回の学習ごとに誤差を表示するか。
# データを生成
n = 100 #100個のランダムなxを生成し、3×X+2の正解dを作っている。
x = np.random.rand(n)
d = 3 * x + 2
# 上記では一直線のデータ展開のため、ノイズを作る。
noise = 0.3 #0~0.3のノイズを作り、dに加えることでまばらな点にする。
d = d + noise * np.random.randn(n)
# 入力値(ここからTensorFlowの実装)
xt = tf.placeholder(tf.float32) #変数を指定して後ほど代入して学習する。
dt = tf.placeholder(tf.float32)
# 最適化の対象の変数を初期化
W = tf.Variable(tf.zeros([1]))#初期値0のウェイト
b = tf.Variable(tf.zeros([1]))#初期値0のバイアス
y = W * xt + b #wとbを学習で求める。
# 誤差関数 平均2乗誤差
線形回帰の実装
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline #プロットはこれを記載するか2回目、3
回目で表示される。
iters_num = 300 #学習回数。for分にいれる。
plot_interval = 10 #何回の学習ごとに誤差を表示するか。
# データを生成
n = 100 #100個のランダムなxを生成し、3×X+2の正
解dを作っている。
x = np.random.rand(n)
d = 3 * x + 2
# 上記では一直線のデータ展開のため、ノイズを作る。
noise = 0.3 #0~0.3のノイズを作り、dに加えることで
まばらな点にする。
d = d + noise * np.random.randn(n)
# 入力値(ここからTensorFlowの実装)
xt = tf.placeholder(tf.float32) #変数を指定して後ほど代入
して学習する。
dt = tf.placeholder(tf.float32)
# 最適化の対象の変数を初期化
W = tf.Variable(tf.zeros([1]))#初期値0のウェイト
b = tf.Variable(tf.zeros([1]))#初期値0のバイアス
y = W * xt + b #wとbを学習で求める。
# 誤差関数 平均2乗誤差
loss = tf.reduce_mean(tf.square(y - dt)) #回帰なのでロスは
平均二乗誤差
optimizer = tf.train.GradientDescentOptimizer(0.1)#学習率
は0.1
train = optimizer.minimize(loss) #ロスを最小化していく。
#TensorFlowの学習の準備ここまで
線形回帰の実装
# 初期化
init = tf.global_variables_initializer() #TensorFlowの初期化
sess = tf.Session() #セッションの立ち上げ
sess.run(init)
# 作成したデータをトレーニングデータとして準備
x_train = x.reshape(-1,1)
d_train = d.reshape(-1,1)
# トレーニング
for i in range(iters_num):
sess.run(train, feed_dict={xt:x_train,dt:d_train}) #変数を代入して、ロ
スを最小化する学習を行う。
if (i+1) % plot_interval == 0: # プロットを行う。
loss_val = sess.run(loss, feed_dict={xt:x_train,dt:d_train})
W_val = sess.run(W)
b_val = sess.run(b)
print('Generation: ' + str(i+1) + '. 誤差 = ' + str(loss_val))
print(W_val)# 結果として3に近くなる。これはノイズでwを3にしたから。
print(b_val)#結果として2に近くなる。これはノイズでbを2に設定したから
# 予測関数
def predict(x):
return W_val * x + b_val
fig = plt.figure()
subplot = fig.add_subplot(1, 1, 1)
plt.scatter(x, d)
linex = np.linspace(0, 1, 2)
liney = predict(linex)
subplot.plot(linex,liney)
plt.show()
Try
ノイズを0.5、wを5、bを3にした場合 ノイズを0.1、wを10、bを20にした場合
ノイズを大きくするとばらつきが大きくなり、小さくすると直線状になる。
W、bの値はいずれも近い値を予測できている。
非線形回帰
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
iters_num = 10000
plot_interval = 100
# データを生成
n=100
x = np.random.rand(n).astype(np.float32) * 4 - 2
d = - 0.4 * x ** 3 + 1.6 * x ** 2 - 2.8 * x + 1 #非線形な解を生成
# ノイズを加える
noise = 0.05
d = d + noise * np.random.randn(n)
# モデル
# bを使っていないことに注意.
xt = tf.placeholder(tf.float32, [None, 4])
dt = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.random_normal([4, 1], stddev=0.01)) #重みが4つ
y = tf.matmul(xt,W) #↑標準偏差0.001のランダムな初期値
# 誤差関数 平均2乗誤差
loss = tf.reduce_mean(tf.square(y - dt))
optimizer = tf.train.AdamOptimizer(0.001)#Adamに変更
train = optimizer.minimize(loss)
# 初期化
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
# 作成したデータをトレーニングデータとして準備
d_train = d.reshape(-1,1)
x_train = np.zeros([n, 4])
for i in range(n):
for j in range(4):
x_train[i, j] = x[i]**j #xの3乗、2乗、1乗をx_trainに代入
# トレーニング
for i in range(iters_num):
if (i+1) % plot_interval == 0:
loss_val = sess.run(loss, feed_dict={xt:x_train, dt:d_train})
W_val = sess.run(W)
print('Generation: ' + str(i+1) + '. 誤差 = ' + str(loss_val))
sess.run(train, feed_dict={xt:x_train,dt:d_train})
print(W_val[::-1])
非線形回帰
# 予測関数
def predict(x):
result = 0.
for i in range(0,4):
result += W_val[i,0] * x ** I #ウェイトが増えた分、複雑になっている。
return result
fig = plt.figure()
subplot = fig.add_subplot(1,1,1)
plt.scatter(x ,d)
linex = np.linspace(-2,2,100)
liney = predict(linex)
subplot.plot(linex,liney)
plt.show()
非線形回帰
ノイズ0.05 dを-0.4,1.6,-2.6,1 ノイズ5 dを3,-2,8,10
ノイズを大きくするとばらつきが大きくなるが、dの値を変えてもうまく回帰することができる。
演習問題
𝑦=30𝑥2+0.5𝑥+0.2
イテレーション10000
学習率0.001
イテレーション30000
学習率0.01
MNISTの分類(1層)
• x:入力値, d:教師データ, W:重み, b:バイアス をそれぞれ定義し
よう
x = tf.placeholder(tf.float32, [None, 784])#28×28で784の入力
d = tf.placeholder(tf.float32, [None, 10])#0~9の10クラスの出力
W = tf.Variable(tf.random_normal([784, 10], stddev=0.01))#ウェイ
トは784×10のシェイプ、stddevは0.01で初期化
b = tf.Variable(tf.zeros([10]))#バイアスはゼロで初期化した10個の出
力
MNISTの分類(3層)
hidden_layer_size_1 = 600
hidden_layer_size_2 = 300
⇒784の入力から600⇒300という隠れ層を通して10個の出力がで
るニューラルネットワークができる。
hidden_layer_size_1 = 600
hidden_layer_size_2 = 300
optimizer = tf.train.AdamOptimizer(1e-4)
MNISTの分類(3層)
hidden_layer_size_1 = 200
hidden_layer_size_2 = 30
optimizer = tf.train.AdamOptimizer(1e-4)
hidden_layer_size_1 = 800
Hidden_layer_size_2 = 400
optimizer = tf.train.AdamOptimizer(1e-4)
隠れ層の数を小さくすると、学習速度は速くなるが、精度が悪くなる。逆に大きくすると学習速度は速くな
るが、精度は高くなる。(精度と速度のトレードオフ)
MNISTの分類(3層)
hidden_layer_size_1 = 600
hidden_layer_size_2 = 300
optimizer = tf.train.AdagradOptimizer(0.1)
hidden_layer_size_1 = 600
Hidden_layer_size_2 = 300
optimizer = tf.train.RMSPropOptimizer(0.001)
Optimizerごとに精度を見ていく。さらに学習回数を上げて、学習精度が頭打ちになったところで打ち切るこ
とで、精度と速度を見ていく。
CNN(MNIST)
# placeholder
x = tf.placeholder(tf.float32, shape=[None, 784])#MNISTのデータを入れる。
d = tf.placeholder(tf.float32, shape=[None, 10])
# 第一層のweightsとbiasのvariable
W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))#5×5はCNNのフィルターサイズで、1チャンネルのものを32チャンネルに拡張を行う。
b_conv1 = tf.Variable(tf.constant(0.1, shape=[32]))#バイアスの定義
# 第一層のconvolutionalとpool
# strides[0] = strides[3] = 1固定
h_conv1 = tf.nn.relu(tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding=‘SAME’) + b_conv1)#パディングがSAMEはshapeが変わらないようなパディン
グを実装している。
TensorFlowでCNNを実装する場合は、tf.cnn.conv2dメソッドに
フィルターを渡してあげるだけで良い。
Max_poolもtf.nn.max_poolメソッドを使える。
CNN(MNIST)
Dropout_ratio=0.5 Dropout_ratio=0
ドロップアウトがあることで汎化性能が上がる可能性がある。
論文から実装
• DNNをやる場合は、先行研究や精度が高い論文を見て実装していくことが必要となる。
⇒どのように実装するか。
⇒arxivで調べると、無料で論文を得ることができる。
例)VGG arxiv
⇒アーキテクチャーの部分が重要。どのように実装するか、精度などが記載されている。
⇒一番エラーレートが低いものを選ぶ。
• VGGやResnetなど有名なものはブルグで実装方法が記載されているものもある。
• コードはGithubですでに実装されているものが上がっているものもある。⇒Usageに使
い方が記載されている。
• C-netなどは新しいものなので、ネットの情報を参考に自分で実装する必要があるものも
ある。
⇒基本的には、すでにあるものを修正していく。
• 物体認識で使われるYoloについてもベーシックな要素は論文に書かれているが、オフィ
シャルなサイトも用意されており、参考にすることができる。
例題解説
正解(a)
(b)最大ではな
く必ず2つ
(c)単純和では
なく重みづけまで
表現されている。
(d)カテゴリの
プラスの確率と2
つの候補領域が出
力される。
確認テスト
VGG、GoogLeNet、ResNetの特徴をそれぞれ完結に述べよ。
• VGG・・・3つの中で一番古く、
Convolution,Convokution,max_poolという単純なネットワーク
の積み重ねでてきておりシンプルな構成となっているが、パラ
メータ数が多い。
• GoogLeNet・・・1×1を使った畳み込みを使った次元削減な
どを行うinception moduleを使っている。様々なフィルターサ
イズを使うことによるスパースなものとなっている。
• ResNet・・・残差接続を行うスキップコネクションアイデン
ティモジュールを使うことで深い学習が可能。
Kerasの実装
Keras・・・TensorFlowのラッパーライブラリであり、ベー
シックな実装を簡単に行えるため初心者には使いやすいディープ
ラーニングのライブラリとなっている。ただし、複雑な実装や柔
軟な対応はできない。
・TensorFlowでは、w、b、x、yをplaceholderで用意したが、
Kerasでは不要。
・Variablesで変数定義も不要。
Keras(線形回帰)
import numpy as np
import matplotlib.pyplot as plt
iters_num = 1000
plot_interval = 10
x = np.linspace(-1, 1, 200)
np.random.shuffle(x)
d = 0.5 * x + 2 + np.random.normal(0, 0.05, (200,))
from keras.models import Sequential
from keras.layers import Dense
# モデルを作成
model = Sequential()#ノルムのSequential()を用意
model.add(Dense(input_dim=1, output_dim=1))#全結
合層を足して1層の根tt-ワークを作っている。
# モデルを表示
model.summary()#モデルを表示(Denseやパラメータ数など)
# モデルのコンパイル
model.compile(loss=‘mse’, optimizer=‘sgd’)#loss(二乗誤差)とoptimizer(隠れ付き勾配降
下法)を定義⇒誤差関数や最適化関数は様々なものが利用できる。
# train
for i in range(iters_num):
loss = model.train_on_batch(x, d)
if (i+1) % plot_interval == 0:
print('Generation: ' + str(i+1) + '. 誤差 = ' + str(loss))
W, b = model.layers[0].get_weights()
print('W:', W)
print('b:', b)
y = model.predict(x)
plt.scatter(x, d)
plt.plot(x, y)
plt.show()
単純パーセプトロン(分類)
# モジュール読み込み
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
# 乱数を固定値で初期化
np.random.seed(0)
# シグモイドの単純パーセプトロン作成
model = Sequential()
model.add(Dense(input_dim=2, units=1))
model.add(Activation('sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
# トレーニング用入力 X と正解データ T
X = np.array( [[0,0], [0,1], [1,0], [1,1]] )#OR
回路
T = np.array( [[0], [1], [1], [1]] )
# トレーニング
model.fit(X, T, epochs=30,
batch_size=1)#for分で回すのではなく、
Kerasの関数で学習している。
# トレーニングの入力を流用して実際に分類
Y = model.predict_classes(X,
batch_size=1)#yのクラスを予測
print("TEST")
print(Y == T)
Keras(単純パーセプトロン)
変更前 np.random.seed(1) ⇒初期値
が変わるため、学習が変わる
エポック数を100⇒ロスが下
がっていくが汎化性能に注意
AND回路
OR回路⇒2つは不正解。非線形なデー
タは学習できないため。 OR回路バッチサイズ10←結果は変わ
らないが速度が速くなる。
OR回路エポック数300⇒同じ
←ニューロンの数を増やす
と学習可能となる。
↑バッチサイズはGPUの性能を
引き出すために、2の倍数で設定
する。(データ数が少ない場合
は少なく、多い場合は多くする。
Keras(Irisの分類)
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()#データセットの設定
x = iris.data
d = iris.target
from sklearn.cross_validation import train_test_split
x_train, x_test, d_train, d_test = train_test_split(x, d, test_size=0.2) #
学習データと検証データの分割
#以下モデルの定義
from keras.models import Sequential
from keras.layers import Dense, Activation
# from keras.optimizers import SGD
#モデルの設定(ReLU、softmaxを利用した2層のNN)
model = Sequential()
model.add(Dense(12, input_dim=4))
model.add(Activation('relu'))
# model.add(Activation('sigmoid'))
model.add(Dense(3, input_dim=12))
model.add(Activation('softmax'))
model.summary()
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, d_train, batch_size=5, epochs=20, verbose=1, validation_data=(x_test, d_test))
loss = model.evaluate(x_test, d_test, verbose=0)#今回のデータのターゲットは0,1,2の3種類のため、
sparse categorical crossentropuを使っている。Metrics=accuracyは学習の途中でaccuracyを表示する。
#Accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.ylim(0, 1.0)
plt.show()
Keras(Irisの分類)
SGD、ReLU SGD,sigmoid
SGD(lr=0.1)
⇒学習率を高くした
分収束が早くなる。
Keras(MNISTの分類)
# 必要なライブラリのインポート
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import keras
import matplotlib.pyplot as plt
from data.mnist import load_mnist#dataというメソッドを使ってデータを読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)#trainとtest
データに分ける。
# 必要なライブラリのインポート、最適化手法はAdamを使う
From keras.models import Sequential
From keras.layers import Dense, Dropout
From keras.optimizers import Adam
# モデル作成
Model = Sequential()
Model.add(Dense(512, activation=‘relu’, input_shape=(784,)))#インプット784、中間層512
Model.add(Dropout(0.2))
Model.add(Dense(512, activation=‘relu’))#中間層はReLUを使っていて512
Model.add(Dropout(0.2))
Model.add(Dense(10, activation=‘softmax’))#アウトプットはソフトマックスでクラス10
Model.summary()
# バッチサイズ、エポック数
batch_size = 128
epochs = 20
model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0,
amsgrad=False),
metrics=[‘accuracy’])#誤差関数はcrossentropy、オプティマイザーはAdam、
history = model.fit(x_train, d_train, batch_size=batch_size, epochs=epochs, verbose=1,
validation_data=(x_test, d_test))
loss = model.evaluate(x_test, d_test, verbose=0)
print('Test loss:', loss[0])
print('Test accuracy:', loss[1])
#Accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
# plt.ylim(0, 1.0)
plt.show()
Keras(MNISTの分類)
• Categorical_crossentropyの場合は、One_hotでは使えない。
その場合は、Sparse_categorical_entropyを利用する。
• Kerasでは、ラーニングレートなどのパラメータを簡単に変更
できるため、試してみる。
• TensorFlowではウェイトのshapeを手計算で決める必要があっ
たが、Kerasでは入力さえちゃんとしていれば、自動でshape
を計算して動くようになっている。
Keras(mnistをCNNで学習)
# 必要なライブラリのインポート
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための
設定
import keras
import matplotlib.pyplot as plt
from data.mnist import load_mnist
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True,
one_hot_label=True)
# 行列として入力するための加工
batch_size = 128
num_classes = 10
epochs = 20
img_rows, img_cols = 28, 28#input_shapeは28×28×1
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
# 必要なライブラリのインポート、最適化手法はAdamを使う
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import Adam
#convolutionのネットワークを組む(conv2d,maxpooling2dで簡単に組める)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))#1層目、出力のチャネル数32、3,3の
フィルターサイズ、
model.add(Conv2D(64, (3, 3), activation='relu'))2層目64チャンネル
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation=‘relu’))#全結合で128次元
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()
Keras(mnistをCNNで学習)
# バッチサイズ、エポック数
batch_size = 128
epochs = 20
model.compile(loss='categorical_crossentropy', optimizer=Adam(),
metrics=['accuracy'])
history = model.fit(x_train, d_train, batch_size=batch_size,
epochs=epochs, verbose=1, validation_data=(x_test, d_test))
#Accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
# plt.ylim(0, 1.0)
plt.show()
Keras(CIFAR-10)
CIFAR-10・・・飛行機や車などのクラスについて画像が用意さ
れている。0~255のRGBで書かれている
。
Keras(CIFAR-10)
#CIFAR-10のデータセットのインポート
from keras.datasets import cifar10
(x_train, d_train), (x_test, d_test) = cifar10.load_data()
#shapeは32×32×3チャンネル、正解はone-hotではない
#CIFAR-10の正規化
from keras.utils import to_categorical
# 特徴量の正規化
x_train = x_train/255.#NNでの入力は0,1などの小さなスケールにする必要があるため、255で割っている。
x_test = x_test/255.
# クラスラベルの1-hotベクトル化
d_train = to_categorical(d_train, 10)
d_test = to_categorical(d_test, 10)
# CNNの構築
import keras
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense, Dropout, Activation, Flatten
import numpy as np
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10))
model.add(Activation('softmax'))
# コンパイル
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
Keras(CIFAR-10)
#訓練
history = model.fit(x_train, d_train, epochs=20)
# モデルの保存
model.save(‘./CIFAR-10.h5’)#あとでこのモデルを呼び出すことができる
ようにしている。
#評価 & 評価結果出力
print(model.evaluate(x_test, d_test))
※実務では、学習済みモデルを保存
しておいて、そのモデルをもとにし
て利用する。
Keras(RNN)
変更なし ノード数128⇒学習精度が上がるがスピードが落ちる。
RNN活性化関数をsigmoid⇒精度が落ちる RNN活性化関数をtanh⇒精度が上がってスピードもアップ
Keras(RNN)
最適化をadam⇒精度高い 入力Dropoutを0.5⇒精度低下
再帰Dropoutを0.3⇒精度多少アップ UnrollをTrue⇒RNNのネットワークを展開することでス
ピードアップ
強化学習
• 強化学習・・・行動の結果として与えられる利益(報酬)をも
とに行動を決定する原理を改善していく機械学習の一つ。教師
あり、なし学習とは別のもの。
【確認テスト】
株式売買の事例
・環境:保険の加入金の最大化を行う部署
・エージェント:株売買を決めるソフトウエア
・行動:株価の変動に応じて買うか、売るかを選ぶ
・報酬:株価上昇で正の報酬、下落で負の報酬を受ける。
強化学習
事前に完全な予測ができる場合は最適な行動を決定することが可能で
あるが、完全に予測ができない場合が多い。
⇒強化学習では完全な予測は成り立たないことを前提としている。
⇒不完全な知識をもとに行動しながらデータを収集し、最適な行動
を見つけていく。
過去のベストの行動のみしているとより良い行動を見つけるとこがで
きない(探索が足りない状態)
未知の行動のみをしていると、過去の経験が生かせない(利用が足り
ない状態)
⇒探索と利用のトレードオフと言い、これを調整することが
強化学習では重要となる。
強化学習のイメージ
①方策を取る(行動)
⇒方策は方策関数で
表される。
②状態を観測する
③報酬をもらう。
⇒価値は行動価値関数
で表される。
強化学習の差分
強化学習と通常の教師あり、なし学習との違い
⇒目標が違う。
・教師なし学習ではデータに含まれるパターンを見つけ出す、
教師あり学習ではそのデータから次の値を予測することが
目標となる。
・強化学習では、優れた方策行動を見つけることが目標
強化学習の歴史
• 強化学習も冬の時代があったが、計算速度の向上、関数近似法
とQ学習を組み合わせる手法の登場などで再び注目を集めるよ
うになった。
• 関数近似法・・・価値関数や方策関数を関数近似する手法
• Q学習・・・行動価値関数を行動する毎に更新することにより
学習を進める方法
行動価値関数・方策関数
• 行動価値関数・・・価値を表す関数で以下2種類がある。
①状態価値関数・・・ある状態の価値に注目する
②行動価値関数・・・行動と価値を組み合わせた価値に注目
⇒Q学習は行動価値関数を行動のたびに更新することで
学習を行うもの。
• 方策関数・・・ある状態でどのような行動を探るのかの確率を
与える関数のこと。(この状態であれば、この
行動をとる確率が10%など)
方策勾配法
• 方策勾配法・・・方策をモデル化して最適化する手法
J・・・方策の良さを定義する。
⇒定義方法には、平均報酬、割引報酬和の2つがある。
・平均報酬・・・行動をとった時に生まれる価値すべての平均
・割引報酬和・・・過去の情報ほど報酬加算割合を減らす(減
衰)
・方策勾配定理
例題解説
正解:(a)
状態価値関数とベルマン方程式から方策勾配定理は導出される。
対数微分法:
DCGAN(論文解説)
DCGAN(Deep Convolutional Generative Adversarial Networks)
・・・CNNのディープなネットワークにより敵対的学習を使って画像
を生成する、という生成系のディープラーニングのネットワーク。
⇒潜在空間でベクトルとして表現したものからGeneratorの部分の
画像を生成するので、数式的に画像を扱うことができる。
(女性の笑顔の画像と普通の顔の画像から笑顔を取り出し、男性の普
通の画像をもとに男性の笑顔の画像を生成する、など)
GAN・・・Generatorが生成した画像と実際の画像を比較し、
Discriminatorというモデルがその画像は作られたものかを判定する。
Discriminatorは正確に判定するために重みを更新し、Generatorは
Discriminatorが判定ができないように画像を生成することを目標に重
みを更新する。
例題演習
正解)(a)
出力D(x)は
入力データ
と訓練デー
タの確率が1
対1、つまり
0.5とな
る。
例題演習
正解)(b)
Discriminat
orはDを最
大化、
Generator
はGを最小
化させる。
例題演習
正解)(a)
0.01とするのが
Leaky ReLUの
定義となる。
Kaggle
• Kaggle・・・データ分析やAIなどの分野の世界一を決めるような世
界大会が開かれているサイト。運用はGoogleが実施しているが、企
業がCompetitionを開いて賞金を出すものもある。
• KernelやDiscussionなどを見るとよい。
• コンテストに出るときには、PCでやりたければデータセットが少な
いものにする、などデータセットの見極めが重要。
• 特徴量ごとに1000以上のスクリプトができたりするため、スクリプ
トの管理が重要。
• 自分だけの力でやろうとすると順位は上がらないことが多いため、
そこそこのスコアが出るKernelを利用して作成すると順位が上がり、
モチベーションが上がる。
• Kernelに上がっているものでDiscussionを利用して作成する。
• 最初はシングルモデルでもよいが、それでは太刀打ちできないため、
チームで良いところを集めてアンサンブルすることで精度が上がる。

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

End challenge part2