Dots nishitoba
-
Author
retrieva-inc -
Category
Technology
-
view
35 -
download
1
Embed Size (px)
Transcript of Dots nishitoba

Chainer で Deep Learning を試す為に必要なこと
株式会社 レトリバ西鳥羽二郎

自己紹介• 西鳥羽二郎• ID: jnishi• 略歴• 東京大学情報理工学系研究科コンピュータ科学専攻 修士課程卒業• 2006 年 Preferred Infrastructure に創業メンバーとして参画
• プロトタイプ開発• プロフェッショナルサービス・サポートサービス• 研究開発
• 2016 年 レトリバ創業• 取締役・リサーチャーとして研究開発に従事• 主に音声認識や自然言語処理を担当

Deep Learning(DL) への取り組み• 2015 年 3 月頃に音声認識で DL が使えそうなことを知る• 2015 年 6 月から Chainer を用いて音声認識エンジンの開発開始• 最適化関数 NesterovAG• 活性化関数 ClippedReLU• 損失関数 Connectionist Temporal Classification
Torch7: Baiduが 2016 年 1 月に公開TensorFlow:
2016 年 2 月に搭載Chainer: 2015年 10 月に搭載

Deep Learning の手法をためそう !

Deep Learning の手法をためそう !

Deep Learning の手法をためそう !

Deep Learning の手法をためそう !
OK 実装だ !

Deep Learning の手法をためそう !
OK 実装だ !

見るべきところ• Baidu の Deep Specch2

見るべきところ• Google の音声認識

見るべきところ• Microsoft の画像認識

Deep Learning のシステムを実装する際• きちんと処理を理解するには数式を理解することが大事• 実際に処理を記述する際には構造を図示したグラフを見ることが多い

ニューラルネットワークの基本単位
x1x2
xn
…
n 個の入力 1 個の出力w1w2
wn
u = w1x1 + w2x2 + …+ wnxn
ユニット

ニューラルネットワークの基本
x1x2
xn
…
n 個の入力 m 個の出力
…
入力を同じとするユニットをたくさん並べる

ニューラルネットワーク ( 全結合 )
x1x2
xn
…
n 個の入力 m 個の入力
…
入力
Linear

活性化関数
x1x2
xn
… u
出力にスケーリングや制限をかける処理を行うことがある活性化関数の例• ReLU: 負の時は 0 にする• sigmoid: 大小関係を維したまま 0 〜 1 にする• tanh: 大小関係を維持したまま -1 〜 1 にする

活性化関数も同様に表せる
入力
Linear
ReLU

ネットワークとして示す• ニューラルネットワーク以下のものをコンポーネントとするネットワークで表すことができる• 入力• Linear• 活性化関数• 損失関数• Convolution 層• 正則化関数• etc.

ネットワークの読み方• Baidu の Deep Specch2

ネットワークの読み方• Baidu の Deep Specch2
入力

ネットワークの読み方• Baidu の Deep Specch2
Convolution 層を 3 段つなげる

ネットワークの読み方• Baidu の Deep Specch2
RNN を 7 層

ネットワークの読み方• Baidu の Deep Specch2
BatchNormalizationを正則化として用いる

ネットワークの読み方• Baidu の Deep Specch2
Linear を 1 層用いる

ネットワークの読み方• Baidu の Deep Specch2
CTC という損失関数を用いる

Deep Learning を行う際に必要なこと• forward 処理• back propagation• 行列計算• 微分計算
• 処理に用いる関数• 入出力の関係• 入力の大きさ• 出力の大きさ
フレームワークが実行 フレームワークを用いて実装する時に考えること

Chainer の example コードclass MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
784(28x28)
100
100
0 〜9の判定10

layer1class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
784(28x28)
100
100
0 〜9の判定10
l1

layer2class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
784(28x28)
100
100
0 〜9の判定10
l1
l2

layer3class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
784(28x28)
100
100
0 〜9の判定10
l1
l2
l3

forward 処理class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
x
h1
h2
0 〜9の判定y
l1
l2
l3

forward 処理class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
x
h1
h2
0 〜9の判定y
l1
l2
l3

forward 処理class MLP(Chain): def __init__(self, n_units=100, n_out=10): super(MLP, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y
Linear
MNIST 画像
Linear
Linear
x
h1
h2
0 〜9の判定y
l1
l2
l3

まとめ• Deep Learning を行う際にはネットワーク構造が大事• 構造が決まれば後はフレームワークが処理を行う• Chainer の場合、 MNIST の train_example.py の例がシンプル• Chainer に限らない