ありまっくすのへっぽこ日記

アラフォーでへっぽこエンジニアをしております。へっぽこなりに頑張っています。

DeepLearning講座(第5回)を受けてきたよ

6/8にDeepLearning講座の第5回目を受けてきました。この講座も折り返し地点。ちゃんとアウトプットして身につけようと思います。

ResNetのおさらい

ResNetはCNNにショートカットをつけたもの。でこれにより、性能を大きく向上させtました。今やCNNといえばResNet。

f:id:ari_max:20180520205928p:plain

ResNet

ResNetの何がすごいのか

CNNは層数を多くすれば多くするほど良いと言われていますが、層を大きくしてしまうと勾配消失したり、特徴が後ろの層まで伝わってくれなかったりして、性能が悪化してしまいます。例えていうなら、大人数の伝言ゲームをしたときに、最初と話が全く変わってしまったような感じです。

それを回避するために、ショートカットをつけて「変えて欲しくないから処理をしない」ということをしています。多層のネットワークになると、最後の方は何もすることがなくなってしまうので、「何もすることがないときには何もしない」ということをするわけです。

ショートカットがない場合は、重みを掛けています。少しでも変化がある場合は重みを少なくすればいいのですが、変化が無い場合の処理(恒等写像)が難しいのです。(単純に0を掛けてしまうとおかしなことになってしまいます。)

ResNetでは「入力と本来の出力の差(残差)」を学習しているのです。

LSTMのおさらい

時系列処理では、過去のデータが現在の状態に影響を与えています。RNNでも時系列処理ができるのですが、「過去の情報のなかで忘れたくないものを覚えておく」ということが難しいので、LSTMを使うのが一般的です。

 

LSTMのフローは以下の通りです。

  1. 忘却ゲートで、メモリセルから不要な情報を消去する
  2. 入力ゲートで、必要な情報をメモリセルへ入力する
  3. 出力ゲートで、必要な情報をメモリセルから出力する 

図解すると、以下のようになります。

  • ht-1→再帰入力(前の時刻の出力)
  • Xt→入力値
  • Ct-1→前のメモリセル
  • Y→出力値
  • ht→次の再帰入力
  • σ→活性化関数(sigmoid)

f:id:ari_max:20180619194630p:plain

LSTM

 

TensorFlowを使ってLSTMの実装を行いました。LSTM用の便利なライブラリもあるけれど、勉強のためにあえてスクラッチで実装しました。

忘却ゲート

入力値と再帰入力(前の時間の出力)に活性化関数(σ:Sigmoid)をかけたものとメモリセルにあるものを掛け合わせて、メモリセルの中身を忘却させているので、このような式になります。

 忘却ゲート = 活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス)

忘却ゲートを通過した後のメモリセルは以下のようになります。

メモリセル × 忘却ゲート

入力ゲート

入力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)と入力値と再帰入力へtanhをかけたもの(下の図の②)を掛け合わせてメモリセルに足しています。

f:id:ari_max:20180622162923p:plain

入力ゲート = (活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))× (tanh × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))

 メモリセル = 入力ゲート+ メモリセル(忘却ゲート通過後)

出力ゲート

出力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)とメモリセルへtanhをかけたもの(下の図の②)を掛け合わせて出力を行なっています。

 

f:id:ari_max:20180622163302p:plain

出力ゲート = (活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))× (tanh × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))

出力値 = 出力ゲート×メモリセル(入力ゲート通過後)

ライブラリ使うと、簡単なんですけどね・・・。

GAN

 GANとは、Generative Adversarial Networkの略で画像生成でブレークスルーを達成した仕組みです。とても難しい(そのわりにうまくいかない)ので、あまり深くは触れないとのことです。

GeneratorとDiscriminatorがあり、学習した画像を元にGeneratorで生成した画像をDiscriminatorが「生成した画像かどうか判断する」という処理を繰り返して精度を上げていきます。

つまりGeneratorはDiscriminatorに「作り物であることがバレないような画像」を生成し、Discriminatorは「本物に近い作り物の画像を見抜く」ということをしているわけです。

 

 

DeepLearning講座(第4回)を受けてきたよ

5/26にDeepLearning講座を受けてきました。今回のテーマは「時系列」でした。

 

最適な初期化

ResNetでパフォーマンスが上がらず、苦しんでいたのですが、理由を講師の方が説明してくださいました。

修正前

shortcut = Convolution2D(n_filters, (1,1), strides=(1,1),kernel_initializer='he_normal', padding='valid')(inputs)

修正後

shortcut = Convolution2D(n_filters, (1,1), strides=(1,1), padding='valid')(inputs)

※he_normalはheの正規分布

初期値の設定方法

今までは「適当に」初期値をとっていたのですが、SGD(確率的勾配降下法)は初期値に依存します。つまり、「良い初期値」で初期化すればより良い答えに到達するわけなのです。

初期化にはheまたはXavierを使うと良いです。

で、heとかXavierって何よ??となるわけですが

Sigmoidの場合
  • 0から1の一様乱数で初期化:0に近いか1に近い値しかとれなくなってしまい、勾配消失してしまう。
  • 0から1のガウス分布正規分布)で初期化:0付近の値しか取れなくなってしまう。
  • Xavierで初期化:いい感じにばらけてくれる。
ReLUの場合
  • 0から1の一様乱数で初期化:多層にするとほとんど0しか取れない
  • 0から1のガウス分布正規分布)で初期化:改善されるけど、まだ0に偏る
  • heで初期化:いい感じでばらけてくれる

(詳細はこちら)

http://murayama.hatenablog.com/entry/2017/11/25/231609

 

時系列処理

時系列とは株価、天気、言語など連続しているものです。以下の特徴が挙げられます。

  • 過去のデータが今の状態に影響している(株価が上昇トレンドなのが影響されるなど)
  • 過去のデータを保持しておく必要がある

画像分類など違って「過去のデータをどうするか」ということがポイントになってきます。つまり、過去のデータを持ってくるループが必要になってくるわけです。

f:id:ari_max:20180605122747p:plain

BPTT

時系列の学習方法として、Back Propagation Trough Time (BPTT)を使います。BPTTはループしている部分を展開し、中間層がたくさんある巨大なニューラルネットワークとして扱っています。

つまり、Back Propagationの概念が使えるということです。

ただし、最初の方の情報が消えてしまうということと、多層であることから勾配消失または勾配発散してしまうという特徴があります。

 

f:id:ari_max:20180606063251p:plain

ループ部分を展開したイメージ

LSTM

RNN(リカレントニューラルネットワーク)では前の情報を忘れてしまうという特徴があるので、時系列を扱うには限界があります。(前の情報でも重要なことは覚えておきたいし、逆に必要のないものは忘れたい)

そこで、出てきたのがLong-Short Term Memory(LSTM)です。

  • 登場は1995年
  • Forget Gateつきの1999年バージョンが有名

 

 RNNからLSTMへ

まずは、活性化関数にtanhを使うRNNを考えてみます。Xが入力、hが隠れ層、Yが出力です。

f:id:ari_max:20180606065130p:plain

 忘却ゲートの追加

Cというのがメモリセルです。このCに忘却ゲートを追加し、忘却ゲートでメモリセルの情報を制御します。0の場合は完全に忘れ、1の場合は完全に覚えています。

f:id:ari_max:20180606065338p:plain
忘却ゲート導入

 

忘却ゲートが導入されることにより、覚えていた情報を「一気に忘れること」ができるようになりました。

入力ゲートの導入

次に、入力ゲートを導入します。というのもRNNでは「忘れたい情報」がある一方で「上書きされたくない、覚えておきたい情報」もあるという相反する要請があるためです。入力ゲートが開いている時だけ、メモリセルに記憶ができるようにします。

 赤く囲んだところだけ見ると、普通のRNNと同じです。

f:id:ari_max:20180607215620p:plain

入力ゲート導入

σが0であれば、何も入力されないというところがポイントです。

重み衝突

覚えておきたい情報は重みを大きくして、活性化されるようにします。が、覚えなくてもいい情報も記憶されてしまい、情報が上書きされてしまいます。このことを重み衝突と言います。

入力ゲートがあることで重み衝突を避け、覚えておきたい情報を減衰しないようにできます。

 

出力ゲートの導入

今度は出力ゲートを導入します。入力ゲートの時と考え方は同じで、出力ゲートが開いている時だけメモリセルの情報を出力します。

f:id:ari_max:20180607225544p:plain

出力ゲート導入


ステップとしては以下のようになります。

  1. 忘却ゲートで、使わなくなった情報をメモリから消す
  2. 入力ゲートで、必要な情報だけメモリセルに入力する
  3. 出力ゲートで、必要な情報だけメモリセルから出力する

実際にうまくいくのかというと難しいです。というのも

  • 覚えなくてもいい情報をメモリセルに溜め込んでしまう
  • 複数のメモリセルに同じメモリセルに記憶してしまう

そのため、学習には色々な調整と長い学習時間が必要になります。そこで簡略化バージョンが取り入れられました。

  • Gated Recurrent Unit (GRU)
  • Minimum Recurrent Unit(MRU)

GRUはメモリセルを廃止して、忘却ゲートと入力ゲートを合わせて更新ゲートとしたもので、使用頻度も高いそうです。

 

Word2Vec

自然言語処理デファクトスタンダード。以下のように、単語をベクトル化し、分散表現で分かりやすくしています。

JapanーTokyo

FranceーParis

自分で実装するのは難しいので、Mechab とGensimを使うと楽です。

分布仮説

類似した文脈に出てくる単語は似た意味を持つという仮説の事です。

例えば「私は〇〇を食べる」という文章だと、〇〇には食べ物が入るはずです。〇〇に当てはまる言葉は「食べ物」という同じ方法のベクトルになります。

シンプルな仮説ですが強力です。例えばWikipediaのようにたくさん文章があるサイトからデータを取ってきたとすると、かなりの数の単語がベクトル化できるはずです。

 

seq2seq

Encoder-DecoderModelの一種です。Encoderでは入力を処理して最終的に一つのベクトルにし、DecoderではLSTMの内部状態を処理して単語を出力します。

f:id:ari_max:20180608000111p:plain

EncodingDecoding

 

DeepLearning講座(第3回)を受けてきたよ

5/11(金)に、DeepLearning講座の第3回目を受けてきました。

テーマはResNet。

ResNetはCNNを改良したもので、非常に性能が良いものと言われています。

その前に前回の復習

 なんでPoolingをするの?

画像を小さくすることによって、計算速度が速くなるが、本来の目的は位置普遍性を持たせるため。畳み込み(Conv)をすると位置は変わらないため、同じ「A」なのに違うものとして認識されてしまいます。

f:id:ari_max:20180518213513p:plain

プーリング

なぜ活性化関数をかませるのか

線形のものは掛け算しても傾きが変わるだけで、意味のある変換ができない。

f:id:ari_max:20180518214506p:plain

線形の変換



ReLuのように非線形のものは掛け算すると意味のある変換ができる

f:id:ari_max:20180519073510p:plain

ReLUの変換

良いモデルって何? 

 良いモデルというのは、以下の条件を満たすものです。

  • 精度が高い
  • パラメータの数が少ない

 

パラメータの数が少なければ、学習速度も認識速度も速くなります。過学習もしにくくなります。 パラメータが少なくして、精度を出すというのがポイントなのです。(それができたら苦労しないけど)

 パラメータ数は1M(M=1,000,000)から5Mくらいが普通。10M越えると多すぎです。

 

 

ResNetとは

Residual Networkの略で、CNNを改良したものです。2015年にMicrosoft Researchが提唱しました。

CNNといえばResNetと言われるくらいのもので、画像認識のだいたいがわかるそうです。移り変わりの激しいDeepLearning界隈で、3年も使われているという優れものです。

どこが優れているかというと、

超多層のネットワークが作れるということです。

 

ニューラルネットワークは層が多ければ多いほど性能が向上するのです。が、以下の問題が発生します。

  • 勾配消失する
  • 特徴が後ろの層まで伝わらない

これを解決するのが、ResNetです。

ResNetは何をするのかというと、「ショートカット」です。

f:id:ari_max:20180520205928p:plain

ResNetではショートカットを行う。

ショートカットを追加するとなぜうまくいくのかというと。。。

  • 入力が最適ならw(重み)は全て0にできる。
  • 最適に近い状態ならwを少しだけ更新することもできる
  • 情報消失が起こりにくい
  • 誤差が伝わりにくい 
  • アンサンブル効果を期待できる(適当にブロックを削除してもあまり精度に影響しない)

 超多層ネットワークの場合、最後の方は「やることがなくなる」はず。

「何もしないようにする」のがResNetなのです。 

 ResNetの中身

ResNetは実際どのような処理を行っているのでしょうか。

下の図のようにコンボリューションの組み合わせにショートカットを加えたものです。コンボリューションを行わず、そのまま足してしまいます。次元の変更がないわけです。 以下の図のような処理のかたまりをResモジュールといい、Resモジュールを何層も組み合わせていきます。

ResモジュールをどうするかというのがResNetのキモになってきます。(色々研究されています)

f:id:ari_max:20180523062836p:plain

ReNetの中身



最新手法とトレンド

ResNetの性能をもっと出すために、色々な手法が提案されています。

ResBlock自体を改造する

層を増やす(BottleNeck)

以下の図のように畳み込みを行う層を増やすという方法があります。

(パラメータ数を増やさずに層を増やしている)

f:id:ari_max:20180523062851p:plain

conv層を増やしたResNet

ショートカットした後は「何もしない」と性能が出ます。

BatchNormalizationした後に処理されるので、ショートカット時のBatchNormalizationは不要なのです。

f:id:ari_max:20180523064501j:plain

  • 足した後に色々操作するのは良くない
  • 足す前にActivation(ReLUなど)しておいた方がいい 
  • ReLUは一つにする

ResNet改良版にはこんなものがあります。

  • WideResNet
  • PyramidNet

独自のブロック

順番を変えるだけでなく、思い切って違う仕組みを取り入れる方法です。

 ResNeXt

入力を分岐させて並列に処理するものです。分岐する数をC(cardinality,濃度)と呼びます。 (分岐の数が1のものがResNet)

ある程度のアンサンブル効果が望めます。

 Xception

ResNetは時間がかかる。。。

計算量の大半はconvolutionなので、Depthwise畳み込みとPointwise畳み込みを組み合わせて使うという手法です。

  • Depthwise畳み込み→チャネル数を1にする
  • Pointwise畳み込み→フィルタのサイズを1×1にする

どうしてこんなことをするのか。。。

入力が H × W × N, 出力チャネル数 M, フィルタサイズ K× K の畳み込みを考えてみると。

  • 普通の畳み込みの計算量 H × W × N × K × K × M
  • Depthwise畳み込み計算量 H × W × N × K × K
  • Pointwise畳み込み計算量 H × W × N × M

普通は M >> K × K なので、

Depthwise畳み込み計算量+Pointwise畳み込み計算量  < 普通の畳み込みの計算量となるわけです。

空間方向とチャネル方向は独立しているので、分けて畳み込みをしても問題はない。

と言われています。

正則化

DeepLearningはとにかく過学習しやすいので、色々な方法で正則化します。

中でも使われている方法は以下です。

StochasticDepth

ResBlockそのものをDropOutする方法で、GANでも使っています。

最後の方は50%ぐらいの確率でDropOutしています。 

f:id:ari_max:20180523204606p:plain

メリットは以下の通りです。

  • 期待値で見たときの深さが短くなる
  • 正則化が期待できる(ランダムにDropOutすることにより、いいフローにしなくてはならない)
  • なぜ、出力層に近い層ほどDropするのかは経験則
Cutout and Random Erasing

 お手軽な割に簡単に性能が上がる。実はCNNに対してはDropOutが有効でない。

  • もともとパラメータが少ない。
  • 隣接画素を推測できる(隣もきっと同じような色だろう。。。)

Random Eragingはランダムにモザイクのようなものをかける

高速化

高速化するためにいくつか方法があります。

SqueezeNet

特別性能が出るわけではないが、小さくて速くてそこそこ性能が出るので人気だそうです。Fire Moduleをつなぎ合わせています。

  • 3×3のフィルタを1×1にする
  • 3×3のチャネルを減らす

f:id:ari_max:20180523233217p:plain

https://openreview.net/pdf?id=S1xh5sYgx

評価

GoogleNetやVGGは時代遅れ。。。

Wide Pyramid Denseは性能が良い。SqueezeNetは速い。

正則化はCutoutがおすすめとのことです。(時間が増えない割に性能が出る)

DeepLeaning講座(第2回)を受けてきたよ

 

4/20にDeepLearning講座の2回目を受けてきました。

今回のテーマはCNN(Convolutional Neural Network)の基礎。

 

CNNってなに?で、何ができるの?

CNNは「畳み込みニューラルネットワーク」とも呼ばれる、ニューラルネットワークです。画像認識(下の図を参照)や画像生成(CNNだけではできないけど)によく使われます。

※ 実際にはCNNを発展させた、ResNetが使われます。

 

f:id:ari_max:20180423073332p:plain

 

  • Classification + Localizetion :分類。四角で囲んで「ここに猫がいますよ」と切り出す。
  • Semantic Segmentation:場所も正確に切り出す。
  • Object Detection:四角で囲む分類を複数できる。
  • Instance Segmentation:複数のものを区別してきりだす。(一番難しい)

 

 なぜ、CNNをやるのかというと

  • 画像系が多い(DeepLearningの大半は画像系)
  • ResNetは他の分野でも使える
  • 畳み込みとプーリングを繰り返すアーキテクチャが優れている
  • 処理を並列化しやすく、GPUとの相性がいい。(GPUは畳み込みを高速化するためのもの)
  • パラメータ拘束ができる(過学習をしにくくする)

といった理由があるそうです。 

CNNの構成

CNNは以下のように畳み込みとプーリングを繰り返し、最後に全結合を行って出力します。

  1. 畳み込み (Convolution)
  2. プーリング (Pooling)
  3. 全結合層(Fully Connected Layer ,Dense)

図解したものが以下。畳み込みとプーリングは繰り返して、最後に全結合します。

f:id:ari_max:20180429101815p:plain

http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

畳み込み

CNNでは一番重要な処理です。とはいえ、やっていることは「掛け算して、全部足す」という内積の計算だけです。

 

下の図のようにInputにFilterを重ね合わせます。(緑で囲んだ場所)そして、重なったマス同士を掛け算して足したものを出力します。

f:id:ari_max:20180428125816p:plain

FilterとInputが重なり合った場所を計算すると以下の図のようになり、足し合わせると4となります。

1 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 = 4

f:id:ari_max:20180428125349p:plain

上の計算をFilterをずらしながら繰り返していきます。ずらす幅を「ストライド」といい、ストライドを大きくすると出力も小さくなります。(普通は1のことが多い)

f:id:ari_max:20180428130116p:plain

フィルタによって検出するものも変わります。(下の図参照)つまり、フィルタをどうするかというのがCNNのキモなのです。フィルタはかつて人間が考えていたのですが、現在はバックプロパゲーションが最適なフィルタを作ってくれます。

f:id:ari_max:20180429015254p:plain

色を検出する場合、RGBで表現するためR・G・Bそれぞれの入力データがあります。フィルタもR・G・Bそれぞれで作成し、フィルタを重ね合わせて畳み込みを行います。重ね合わせたフィルタの数をチャネル数といい、入力とフィルタのチャネル数は合わせておく必要があります。畳み込みを行うとチャネル数は1になります。

f:id:ari_max:20180429084918p:plain


1つのフィルタから出力されるデータのチャネル数は1ですが、フィルタは複数使用するので、結果として「出力されるデータのチャネル数=フィルタ数」となります。

 

プーリング 

出力されたものを半分にする。プーリングにはいろいろな方法がありますが、Max Poolingを使うことが多いです。

下の図のように、同じ色で囲んだ部分の中で最大のものを出力とします。

f:id:ari_max:20180429105842p:plain

 あとは、畳み込みとプーリングを繰り返していきます。畳み込みを何回やるのか、どこにプーリングを入れるのですが、どうするのかは試行錯誤でした。しかし、VGGNetの登場によって指針ができました。指針は以下の通りです。

  • 何度か畳み込みをする
  • MaxPoolingをすると同時にフィルタを倍にする

f:id:ari_max:20180429115707p:plain

 

パディング

 畳み込みをするとデータが小さくなるので、繰り返し行うと出力サイズが1になってしまい、畳み込みができなくなってしまいます。そこで、畳み込みを行う前に入力データの周りに固定のデータを設定します。

f:id:ari_max:20180429121030p:plain

 

全結合層

畳み込みとプーリングを繰り返したあとはデータをバラバラにして(フラットにする)、ニューラルネットワークの処理をして出力を行います。

 

出力サイズの計算方法

出力サイズは以下の式で計算できます。

H’ = (H + 2P - F) / S + 1

W’ = (W + 2P - F) / S + 1

H’, W’: 出力サイズ

P: パディング(padding)

F:フィルタサイズ

S:ストライド(stride)

DeepLeaning講座(第1回)を受けてきたよ

先々週の話。

DeepLeaning講座を受けてきました。以前に受けていた機械学習講座のアドバンス版。

前回受けた機械学習の講座の続きという位置付け。これから全8回がっつりディープラーニングに浸ってきます。

この講座はJDLAのカリキュラムに準拠しているとのこと。個人的には先生が実務で使われているものをもっと知りたいなー。と思っていました。

深層学習ってそもそも何?

DeepLeaningは人間様の力を借りずに機械がデータの特徴を抽出して学習を行うことです。MITが発刊している『Deep Learning Book』には以下の様に記載されています。

Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as a nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones. 

線形性と非線形

線形性とは以下の図式が成り立つもの。(非線形性は、線形でないもの)

  • f (x+y) = f(x) + f(y)
  • f(cx) = cf(x)

以下の図のようなものが線形、1次関数ですね。線形は解くのが簡単というメリットがあります。1次関数でないものは全て、非線形です。

f:id:ari_max:20180422163454p:plain

ニューラルネットワーク

脳のニューロンのように、ある刺激に対して反応するアルゴリズム

人の脳はニューロンがネットワーク上に繋がっており、ニューロン間で情報をやりとりしています。やりとりしている電気信号がある閾値を超えると発火します。

f:id:ari_max:20180421193602p:plain

ニューラルネットワークはこの仕組みを模したものです。入力データを受け取り、受け取ったデータは重みを変えて(入力元が違うのでそのままでは使えない)計算をします。計算結果が閾値を超えたら発火します。図の場合、計算式は以下の通り。

w1jx1 + w2jx2  + w3jx3 = yj 

ベクトルの内積を求めていることになりますね。

f:id:ari_max:20180422150754p:plain

ニューラルネットワークは上の図をたくさん組み合わせたもので、下の図のようになります。いい感じのWとφが見つかれば、y = f(x)が学習できるはず。。。です。

 

コスト関数

最適なパラメータを見つけるために、実際の値とモデルで計算した値の誤差を求めます。この誤差のことを「コスト関数」といい、コスト関数を小さくすることでモデルの精度を上げて行きます。ニューラルネットワークの場合、コスト関数を小さくするためにはwの値を調整していきます。

ニューラルネットワークは右の図のようにコスト関数が非凸型なので、最小値を求めるのが難しいのです。確率的勾配降下法を使って最小値を求めていきます。

f:id:ari_max:20180422172731p:plain

凸型関数(左)と非凸型関数(右)


ロジスティック回帰でのコスト関数は以下の通り。

f:id:ari_max:20180422172936p:plain

シグモイド関数を使った時のニューラルネットワークのコスト関数は以下。

出力ニューロン数分合計するというところが異なります。

ロジスティック回帰を並べたようなイメージです。

f:id:ari_max:20180422172949p:plain

 

活性化関数

ニューロンを発火させる関数のことを活性化関数と言います。かつてはsigmoid関数を使うことが多かったのですが、現在はReLUを使うのが主流です。ReLUはRectified Linear Unit(正規化線形関数)の略で、ランプ関数とも呼ばれます。

g = max(0, z) → 0以下なら0,それ以外はそのまま

で、グラフにすると以下のようになります。

 

f:id:ari_max:20180422174055p:plain

以下のようなメリットがあります。

  • 勾配が消えない(x>0の場合、xの値によってyの値が変わる)
  • 計算コストが低い
  • 性能が良い

それに対して、sigmoidは以下のような形状です。

勾配が消えてしまうので、隠れユニットとしては良くありません。sigmoidを長く使っていたために、ニューラルネットワークは発展しなかったとも言われています。

  • 0付近でも入力に敏感なため、最適化が難しい
  • |x|が大きいと勾配が消える(値が変わらない)

f:id:ari_max:20180422232834p:plain

ReLUには他にも種類があります。

f:id:ari_max:20180422232738p:plain

 Leaky ReLUは負側にも傾斜をつけることによって、勾配が消えないようにしています。がLeRUを使うとL1正則化の効果が得られるというメリットもあります。

 

万能近似定理

実務では出てこないけど、考え方としては大事なもの。

非線形の隠れユニットを使っていれば、3層のネットワークで表現できるというものです。(学習できるわけではない)

 

Forwardモード微分

ある入力を変化させた時、どのように出力が変化していくのか見る方法

a=1,b=2の時の例

 

f:id:ari_max:20180422235211p:plain

 

Fowardモード微分は全てのルートを辿るので、とても大変。

入力の次元>出力の次元であることに注目したのがReverseモード微分

 

Reverseモード微分

ある出力を変化させた時、各点がどのように作用しているかをみる方法

出力の数だけ見ていけば良い。ディープニューラルネットワークではよく使う。

a=1,b=2の時の例

f:id:ari_max:20180422235124p:plain

 

誤差逆伝播法 

 Reverseモード微分を使って勾配を計算する方法で、入力層から出力層まで内積を求めて出力を得るものです。以下のフローで計算します。

  1.  入力層から出力層まで内積を求めて出力を得る
  2.  損失関数の各出力に関する微分δを求める
  3.  δを逆伝播させていき、重みに関する全勾配を求める
  4. パラメータを更新

 

カスタマージャーニーの勉強

昨日はUX DAYS TOKYOスタッフの方でカスタマージャーニーを作成しよう のワークショップに参加された方が復習会を開催してくださったので、参加してきました。

ちなみに、スピーカーであるBOON氏はこの方です。

https://2018.uxdaystokyo.com/speakers/#speaker-boon

 

私は同じ時間に違うワークショップに参加していたので、参加できず。。。

自分の中での大きな気づき

  • カスタマージャーニーは一つではない
  • カスタマージャーニーは美しく作るものではなく、コミュニケーションのためにある
  • ジャーニーの中からJOBS TO BE DONEを探す

エンジニア目線ではあるのですが。。。新しい機能を設計・開発するときに「オーディエンスは誰?」「ゴールは何?」「どうやって実現する?」と深掘りしながら進めていこうと思いました。

特にエンジニアは「こういう手法を使いたい」などという手段が目的になりがちな人たちなので。。。

 

実際にワークをやってみた

概要の説明を受けた後、カスタマージャーニーマップを作成してみました。

一人だとなかなか難しいので、グループワークは助かります。

「UX DAYS TOKYO 2019を成功させるには」という大きなお題でカスタマージャーニーを作成します。

私たちのグループはワークショップの改善点をインプットに、カスタマージャーニーを作成しました。

大きなゴールとして「法人申し込みの方が、『UXは大事!』と気づきを得て会社にいい影響を与える」「これは使えるなと感じること」を設定し、具体的に出来ることへ落とし込んで行きました。

 

f:id:ari_max:20180401173849j:plain

 

 

大きなゴールを決めてから「どうやって実現するの?」と深掘りしていく作業が重要ということに気づきました。 このフィードバック会に参加しなかったら、「さとうさん」という具体的な人物も出てこなかったですし、彼(彼女)のジャーニーはできなかったと思います。

大きなゴールだけを作ると「レベル1でボス戦に挑むようなもの」となってしまうということをワークをしていて実感しました。

 

恥ずかしながら、カスタマージャーニーマップを使ったことがなければ「カスタマージャーニー」と言っても分かる人がいない状態というのが現状なのですが、 コミュニケーションのツールとして「カスタマージャーニー」を広めていこうと思いました。

UX DAYS TOKYO 参加レポート(ワークショップ1日目)

なかなかブログが書けず。。。文章を書くのが苦手だから、ちょこまか書かないと。。。と思いつつもなかなかできません。。

3/17(土)はUX DAYS TOKYOのワークショップに参加させていただきました。私が参加したのは、Google Lensのデザインリードを行なったAdrian Zumbrunnen(エイドリアン・ザンブルネン)氏の対話型UIに関するワークショップでした。

https://2018.uxdaystokyo.com/workshop/#session-adrian

ワークショップの様子

ワークショップは35名程度の方が参加されていました。男女比は6:4ぐらいで、多少男性が多い印象です。グループワークは7〜8名くらいのグループに分かれて行いました。

8時間(うちランチタイム1時間)に及ぶワークショップで、手を動かしたりグループ内で話し合ったりという時間が多い印象でした。いろいろなワークショップに参加していますが、質疑応答に1時間時間が確保されていたのは初めてでした。

学んだこと

非常に盛りだくさんのワークショップで、多くの学びがありました。中でも印象的だったのは、以下です。(あくまで、主観ですが)
 
  • 人は『自分は会話をできる』と思っているので、会話型UIに対する期待値が高く、会話が続かないと、自分ではなく相手のせいだと思うこと
  • チャットボットなどのシナリオを作る前に、サービスの設計をするのが重要であること
  • 会話は協調原理を前提に成り立っていること
 
以前に参加した事前勉強会では、チャットボットのシナリオを作ろうとしてもうまくできなかったのですが、それはサービスの設計をしていないのが理由の一つだったことがわかりました。いきなりシナリオを作っても意味がなくて、「どういうサービスにするのか」「ユーザーの求めるものは何なのか」「会話型UIが有効なのか」ということを深く考えていかないといけないということを学ぶことができました。
 

おまけ

UX DAYS TOKYOはお弁当も豪華で楽しみの一つです。

今日のワークショップはなだ万のお弁当でした。肉食女子には物足りないようでしたが、健康に気をつけないといけないアラフォーにはちょうど良かったです。

なだ万のお弁当

アラフォーには嬉しいヘルシーなお弁当