Coursera 〜Deep Learning Specialization〜 受講の備忘録

# はじめに
以前、courseraにて提供されているAndrew先生の[Machine Learning](https://www.coursera.org/learn/machine-learning)を受講し、非常に勉強になったので[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)も受講させて頂きました。他の方が日本語要約や受講内容の解説等、素晴らしい投稿をされておりますが、そんなハイレベルな事はできないと思ったので、**受講前後のギャップ、受講により得られるもの、内容のざっくりとしたまとめ、備忘録的な進捗詳細**を書くことにしました。
備忘録とはいえ、なるべく感じたこと・得られた事を具体的に記載する事で、これから始めようとしている方に少しでも参考になる記事になればと思っております！
（本講座の構成や内容に関する説明は他の記事で多く取り上げられているため省略します。）

#自己紹介
一応どんな人物がこの記事を書いているのか具体的なイメージがないと解釈も変わってくると思ったので記載します。
- 社会人4年目。営業2年・マーケティング1年経験後、未経験転職にて4月よりコンサルティング会社に入社
- 現職では自然言語処理を中心とした業務に従事。pythonやDockerを活用。
- 英語は数年前にTOEIC700点代だったものの、おそらく現在は500点レベル

#受講前と受講後のギャップ
受講前に感じていたことと、受講後に感じた事のギャップを記載します。
ご自身が実際にコースを受講する際に、**苦労しそうor問題が無さそうなスキルの判断基準**として、参考にして頂ければと思います。

- **「自分のスキルで受講し切れるのか？」（英語、プログラミング、数学）**
    - プログラミング：Pythonに関しては問題なかった（基本的なpythonの文法やnumpyを用いた計算ができれば進められる）。ただしkerasを活用したDeeplearningの実装には慣れておらず苦労をした。（公式ドキュメントを読みながら実装できれば何とか進められる、理解できるかはまた別）
    - 英語：１章、２章、４章は日本語翻訳・字幕があるため問題ない。課題もGoogle翻訳に入れれば分かるため理解はできる。ただし３章、５章に関しては基本英語字幕のため、理解が５〜７割掛けになってしまう。理解が追いつかない箇所はGoogleで日本語の記事を探し、読む事で補完はできる。
    - 数学：行列の計算が分かれば仕組みは理解出来た。微分に関してもイメージくらいであれば理解できる。Backpropagationの理解をしようとすると髙い数学知識が求められるため、こちらは要勉強（自分はふわっとした理解で終わらせた）

- **「お金もかかってるし、遅くても2ヶ月以内に終わらせたいけど、いけるのか？」**
    - 結論2ヶ月以内に終わらすことが出来た（詳細な勉強時間や各パートに要した日数は下記に記載）。毎月お金がかかるため1ヶ月以内に終わらせたかったが、さすがに厳しかった。。

- **「受講して意味あるのか？身になるのか？」**
    - 確実に意味ある講座だった。理由としては、Deeplearningの基礎的な理解、発展事例までを実装を通じて学ぶことができるため、単なるインプットのみで終わらなかったため。ただ、数週間もすれば忘れる＆全てを覚えていられる訳はないと思うので、ここからどこにフォーカスして勉強を進めていくかの指針は必要と感じた。


# 得られるもの
形に残るものして、**修了証**が受け取れます！（こちら以外にも各コース毎に5つの修了証が発行されます）。またこちらは正式にLinkedinとかにも共有ができるようです。
まあ実務で何が出来るかが一番重要だとは思いますが、自分への自信や一応基礎知識があるという証としても、修了証があるのは何とも嬉しいものです。笑
![スクリーンショット 2019-08-21 22.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310010/1d95568f-cac2-8a58-74d3-0457cf0342a5.png)


#学習内容のまとめ
本講義にて学んだ内容に関して、**「実務のプロジェクトにおいてどのような時に活かせるのか」**という点でまとめてみました。
理由としては私自身コンサルティング業務に携わっており、DeepLearning関連のプロジェクトを想定した際に、今回学んだ内容がどのように活かせる事ができるのか言語化しておきたいと考えたためです。
（下記のステップが正しいかはケースバイケースだと思うので、参考程度にお願いします。）

- **「業務課題・ユースケースの設定」**
    - 利用者からのAIに対する期待・求めている事
    - DeepLearningが人間より卓越している分野
    - 各分野へのDeepLearning活用（画像認識、物体検知、顔認識、画像合成、自然言語処理、言語モデル、機械翻訳、言語生成）
    - 評価指標の決定（最適化重要指標の決定、その他指標の目標閾値設定）
- **「データ選定・分析アルゴリズム決定」**
    - 各アルゴリズムの概念（ロジスティンク回帰、ディープニューラルネットワーク、CNN、ResNet、YOLO、RNN、GRU、LSTM、Word2Vec、Attention、Seq2Seq）
    - 利用データの信憑性（実運用時の利用データとの整合性、データの偏り）、データ分割の中身・割合（学習:テスト:評価）
    - 人工データの生成（反転、カラーシフト、など）
    - 学習/テストデータ用意、モデル学習、予測までの一連の流れ
- **「システム実装・モデル作成」**
    - 各言語、ライブラリの理解（python、tensorflow、keras）
    - 一般的なDeepLearningの仕組み（隠れ層、ユニット数、Forward/Back Propagation、活性化関数、最急降下法）
    - 各アルゴリズムの実装（ロジスティンク回帰、ディープニューラルネットワーク、CNN、ResNet、YOLO、RNN、GRU、LSTM、Word2Vec、Attention、Seq2Seq）
    - 転移学習、マルチタスク学習の理解
    - OSS活用による実装コストの削減
- **「モデル改善・パラメータチューニング」**
    - モデル学習改善のポイント（クイックに、仮説を立てながら）
    - 学習率、bias/variance、Regularization、Dropout、パラメータ初期化
    - バッチサイズ最適化
    - 指数加重平均、Momentum、RMSprop
    - 局所最適解への対処
    - パラメータチューニングの優先順位、設定方法、パラメータの決定方法
    - その他CNN、Word2Vecなどの各アルゴリズムにおけるパラメータ

#進捗詳細（参考）
各コース・週にて**何を学び、どんな所で苦労をしたか**を記載しております。メモ程度にだらだら書いている部分もあり、長文になってしまったのでご興味がある方はご覧ください。

- 開始時期・学習量
    - 今年の6/30に登録、受講開始。8/21に終了。
    - 学習頻度は、休日に２〜３時間、平日に１時間程度

##1.Neural Networks and Deep Learning
- 期間：10日間で終了。Courseraの[Machine Learning](https://www.coursera.org/learn/machine-learning)を受講していた事もあり課題をスムーズに進める事が出来たため、予定より早く進める事が出来た。
- 全体的な所感：[Machine Learning](https://www.coursera.org/learn/machine-learning)にもNeuralNetworkに関する講義はあったが、その内容をより詳細に説明をしており、具体的なイメージが付くような内容だった。また非常に親切なガイダンスは記載しているものの、Pythonで0からDeepLearningを構築する経験をした事で、DeepLearningの全体の流れ（パラメータ初期化、ForwardPropagation、コスト計算、BackPropagation、パラメータ修正）を具体的に理解をする事が出来たのは良い知見となった。
- 苦労をした点：やはりBackPropagationの微分に関しては、自ら計算する事が難しく、その部分は0から構築が難しい。ただなぜ微分により計算を行なっており、どのように活用されているかの理解をすることはできた。

###１週目. Introduction to deep learning
- 期間：1日
- 得られた点：
    - なぜ昨今DeepLearningが注目されており、これだけ技術が進歩してきたのかの理解。
    - DeepLearningの重要性。
- 苦労した点：特になし

###2週目. Neural Networks Basics
- 期間：3日間
- 得られた点：
    - ロジスティック回帰の概要、どのように最適なパラメータを求めているかの数式理解
    - 微分の直感的な理解（単純に関数の傾きを求めている）
    - Pythonでfor文を使わずにnumpyを活用しベクトル化する事で、処理スピードが向上する事
    - Forward/Backpropagationの仕組み
    - トレーニングセットやデータセットを活用し、モデル学習・構築から予測までを行う一連の流れ。
- 苦労した点：たまに日本語約の無い動画があり、英語の理解に苦労した（正直英語がわからなくても動画を見れば数式を追う事で何となく理解ができる）。変数に入っている配列の大きさが正確に把握できておらず、行列同士の演算にエラーが発生していた。

###3週目. Shallow neural networks
- 期間：3日間
- 得られた点：
    - ニューラルネットワークの仕組みに関する理解（Forward/BackPropagation,活性化関数の種類、微分の直感、最急降下法、ランダムによる初期パラメータ）
    - ニューラルネットワークを構築する上で、多数のレイヤー、トレーニングデータを活用する際のベクトルの使い方。
    - ライブラリを使用せずにニューラルネットをPythonにて0から構築する方法。
    - HiddenLayerとOverFittingの関係。
    - プログラミング演習において、各メソッドの入力・出力・各変数のベクトルサイズを意識すると、処理の流れがイメージする事ができ、非常にスムーズに課題を進める事ができた。
- 苦労した点：Backpropagationにて出てくる微分の式を直感的に理解をするのに時間がかかった。

###4週目. Deep Neural Networks
- 期間：3日間
- 得られた点：
   - DeepLeaningにおけるベクトルの表記方法
   - ベクトル同士の演算におけるコツ(ベクトルサイズの確認を随時行う)
   - DeepLearningにおける全体の処理の流れの理解（入出力の流れ、パラメータの更新方法）
   - レイヤー間の重みとなるパラメータW,バイアス項であるパラメータbとハイパーパラメータ（HiddenLayer数、ユニット数、学習率、活性化関数、･･･）の理解
   - ライブラリを使わずにPythonでDeepLearningを0から構築する方法
- 苦労した点：最後のプログラミング演習においてDeepLearningを0から実装し、全体像を理解するのに苦労をした。


##2.Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
- 期間：8日間で終了。
- 全体的な所感：Deeplearningの精度やパフォーマンスを向上させるための手段の全体像がイメージ出来たパートだった（入力データの与え方、過学習への対応、学習時間の短縮、など）。しかし正直実際のデータを活用した上でチューニングをしてみないと、ハイパーパラメータの設定がどのように効くのか何とも言えないなと感じた。実際に構築を行う際、最適なハイパーパラメータを設定するのに苦労をしそう。また良く活用されているTensorflowによりプログラムを構築できたのは達成感があった。これまでのパートにてDeeplearningの処理を理解してきたため、Tensorflowにて簡略的に記載されている処理のイメージが付きやすかった。
- 苦労をした点：このパートから日本語訳はほとんど無くなってくるため、如何に英語から理解をしていくかに一番苦労をした。英語の勉強は目的ではなかったため、とにかくGoogle翻訳に突っ込みスピード重視で理解を進めていった。また動画のみで100％理解をする事は難しい考え、早々にクイズやプログラミング課題に着手することで理解を進めていった。

###1週目. Practical aspects of Deep Learning
- 期間：5日間
- 得られた点：
    - 従来の機械学習と比較したTrain/dev/test setの割合
    - bias/variance、Regularization(L2/L1)の理解
    - トレーニング時にUnitの個数を減らすDropoutの理解
    - トレーニングをスピードアップするためのNormalizing inputs
    - Gradient Checking
    - DeepLearningのパラメータWの初期化（0は×、Randomは△、Heは○）
    - 各正則化を実装した際の予測精度の変化。
- 苦労した点：日本語訳がある動画が少なくなり、学習に対するスピードが落ちてきた（通常は1.5倍速で見ていたのを、1.25or1.0倍速でないと理解が進まない）。Gradient Checkingに関する理解は正直浅いままとなった。。

###2週目. Optimization algorithms
- 期間：1日
- 得られた点：
    - ミニバッチによる勾配降下法（1つのミニバッチは64~512の2の累乗が良い)、確率勾配降下法との違い
    - 勾配降下法を最適化するアルゴリズム（指数加重平均（Exponentially weighted average)、Momentum、RMSprop、Adam、学習率αの減退）
    - 局所最適解への対応
- 苦労した点：日本語訳は無くなったので、英語で何とか頑張るしかなくなった。MomentumやAdamで使われている数式の意図を理解する事が難しかったが、プログラミング課題にて実装をする事で何となくイメージをすることは出来た。

###3週目. Hyperparameter tuning, Batch Normalization and Programming Frameworks
- 期間：2日間
- 得られた点：
    - ハイパーパラメータのチューニング優先順位（学習率α > Momentumのβ、HiddenUnits、Mini-batch size > レイヤーの数, Learning rate decay > Adamのβ1/β2/ε）
    - ハイパーパラメータの設定方法（任意のハイパーパラメータをランダムに設定し、結果を検証）
    - ハイパーパラメータ決定のアプローチ方法（BabySittingOne, TrainingManyModels）
    - 学習を加速させるバッチ正規化（活性化関数への計算前に実装）
    - Multi-classへのソフトマックス関数
    - Tensorflowを含むNeuralNetworkライブラリの紹介、Tensorflowの基本的な実装方法、Deeplearningの構築方法。
- 苦労した点：Tensorflowの書き方に慣れず最初は戸惑った（何回か書くうちに次第に慣れる）

##3.Structuring Machine Learning Projects
- 期間：4日間
- 全体的な所感：技術面ではなく、プロジェクトを進めていく上での視点や実績的な改善方法を学ぶ事ができ、これまでの技術を活用した上で具体的に何をすべきかイメージがしやすくなった。クライアントやユーザーは技術に関心があるのではなく、どのくらいの精度でどれだけ課題が解決されるのか、に関心があると感じ技術ドリブンでのプロジェクト進行は本末転倒であると気づきを得られた。また最後の課題であるケーススタディを通して、如何に限られた時間の中で課題の特定・課題解決に向けたアプローチが必要かを実感できた。問題発見→改善→検証→問題発見、を如何に高速に繰り返しより良いモデルを構築できるかが重要になってくるという事を学習した。
- 苦労をした点：全ての講義に言えるが英語力の不足により、講義の内容を100％理解をすることに一番苦労をしたパートだった。これまでのパートのように図などの視覚的な学習が困難だったため、とにかく翻訳機能を使って具体的に理解ができるように努めたパートだった。

###1週目. ML Strategy (1)
- 期間：2日間
- 得られた点：
    - PJT開始時に評価する指標の設定(最適化の指標は1つに絞り精度改善、他の指標は要件を満たす閾値を下回るように維持)
    - train/dev/test setのデータ（将来得られるデータと同様の分布のデータを活用すべき）
    - データ分割（ディープラーニングのような巨大なデータの場合、従来の70:30のデータ分割ではなく、98:1:1の割合で十分テストが実施できる）
    - 人間のパフォーマンスとの比較（Bias/Varianceの改善は人間のパフォーマンスとの比較により決まる。
    - Deeplearningが人間より卓越したパフォーマンスを生み出す分野）。
- 苦労した点：最後の課題がケーススタディのような内容であり、純粋に英語の読解をするのに苦労をした。

###2週目. ML Strategy (2)
- 期間：2日間
- 得られた点：
    - エラー分析。学習データのラベル付けが誤っている際の捉え方。
    - 新しいPJTでのモデル学習（とにかくクイックに動くものを作成し、改善を行いながら進めていく）
    - Train/Dev/Testデータのミスマッチ（Bais/Variance/Mismatched Data Distribution）
    - 人工的なデータ合成。転移学習、マルチタスク学習。
    - エンドツーエンドにて深層学習を行う際の基準、メリット、デメリット。
- 苦労した点：様々な学習方法が取り上げられており、正直全てを理解することは難しかった。何となくのイメージが付いただけの理解となってしまった。

##4.Convolutional Neural Networks
- 期間：13日間
- 全体的な所感：DeepLearningで特にブレイクスルーが起きた画像処理に関して、全般的な概念を理解する事ができたパートだった。画像の処理の仕方（画像ファイルの変換、CNNによる畳み込み、など）や、圧倒的な性能を誇るResNet、また物体検知や顔認識アルゴリズムなどをプログラミング課題を通じて学ぶ事ができ、なぜこのように画像処理にてAIが活用されているのか理解をする事ができた。またDeepLearningのフレームワークであるkerasをいじる事ができたのも面白かった。
- 苦労をした点：概念として理解をする事ができたものの、実装に関しては非常に苦労をした。DeepLearningの実装でも苦労をしたが、特にkerasは知識もなくイメージも湧きづらい点もあったため実装に時間がかかった。

###1週目. Foundations of Convolutional Neural Networks
- 期間：3日間
- 得られた点：
    - 畳み込みニューラルネットワークに関する全体の構造理解
    - フィルター(任意の数値f×fのフィルターを活用し、データの畳み込みを行う)
    - Padding(Valid:paddingをしない、Same:入力と出力が同じになるようにpaddingする)
    - Stride(移動のステップサイズ)
    - 画像のような3Dデータの畳み込み方法
    - 畳み込み層、プーリング層、全結合層
    - 畳み込みニューラルネットワークの利点（パラメータを共有して活用するためDeeplearningで使用するパラメータより少ないパラメータのみ学習をすれば良くコストが安い、疎結合であり過学習を起こしにくい）
    - Tensorflowを用いて、CNNを0から実装する方法。
- 苦労した点：プログラミング課題において、パート1の最終課題と同様に、CNNを0から実装をするのに苦労をした（変数が4次元のため全体のイメージがしづらくなり、計算の整合性が合わなくなってくる）。

###2週目. Deep convolutional models: case studies
- 期間：3日間
- 得られた点：
    - LeNet-5の概要(手書き文字の認識のために作られた、グレースケールの画像を分類する)
    - AlexNetの概要(RGBの画像を分類、LeNetより膨大なパラメータ活用により精度向上)
    - VGG-16の概要(ネットワーク構造が単純だがより深く、パラメータ数は億を超える)
    - ResNetsの概要(ある層で求める最適な出力を学習するのではなく、層の入力を参照した残差関数を学習する。層を深くしても学習誤差が下がり続ける特徴がある。勾配消失に対応できる。)
    - identity block(shortcut pathの次元数を変更せずにmain pathへの計算を行う)、convolutional block(shortcut pathの次元数を変更し、main pathへの計算を行う)
    - 1x1Convolutions(1x1の畳み込みを計算することで、性能を下げずに計算コストを大幅に下げる事が出来る)
    - Inception Network(1x1Concolution等を組み合わせ構築したIncepotionモジュールにより構築されたネットワーク）
    - 転移学習の概要(学習データ量が少ない場合に効果的)
    - Data Augmentation(反転、画像のランダム抽出、カラーシフト、・・・)
    - オープンソースを如何に活用して、スピーディーにモデルを構築する事の大切さ(DLは学習コストが高い)
    - kerasを用いた50層のResNetNetworkの実装。kerasの何となくの使い方。
- 苦労した点：kerasの実装に関して、CNNの全体像がイメージ出来ていないと上手くネットワークが構築できず、エラーと戦う場面が多かった。shortcutによるXとConv2D前のXを”+”で足すとエラーとなり、初心者が良くやるミスとのこと（Add()を利用することで足す事ができる）。

###3週目. Object detection
- 期間：3日間
- 得られた点：
    - 物体検知に関する概要(物体の中心と物体検知する箱の高さと幅を求める、正解ラベルyの定義方法、Landmark Detection)
    - Sliding Windows Detection(画像を格子状に区切り、任意の箱を各格子に当てはめ目的の物体が存在するか判別する。ただ格子状の目が細かいほど膨大な時間が掛かる）
    - YOLOアルゴリズム(格子状に順番に処理を行わず、1回で全ての格子の物体検知が算出できるため、学習が早い。)
    - Intersection Over Union(IoU。物体検知の精度を測る評価方法。予測の箱と実際の箱の2つの重なりを比較して精度を算出する。)
    - Non-max Suppression(1つの物体を複数の物体として検知をしないようにするためのアルゴリズム。検出確率が最も高い箱のみ残し、近傍の重なる箱は除外する。)
    - Anchor Box(物体と最もIoUの高いアンカーボックスが紐づけられる。アンカーボックスの個数は、物体検出の対象をk-meansにて分類した数を設定すると良い。)
    - 物体検出までの流れ(画像input→CNNによる畳み込み→YOLOによる物体検出)
- 苦労した点：プログラミング課題のYOLOアルゴリズムの実装に非常に苦労した。各次元にどのような値が格納されているかイメージが曖昧なまま取り組んでいたため、正確なコードを実装するのに時間がかかった。良く分からない初歩的なエラーに２日間くらい詰まり挫けそうになった。

###4週目. Special applications: Face recognition & Neural style transfer
- 期間：4日間
- 得られた点：
    - 顔認識の概要(One Shot Learningに対応するために、2つの画像のSimilarityを算出し、閾値以上か以下かにより認識を行う)
    - Siamese Network(特定の入力に対して、全結合層の段階にて符号化を行う。例えば画像が入力されたら、128次元に畳み込みを行い、この次元をその画像の符号とする。2つの入力のSimilarityを算出するには、この符号同士を比較させ、差を算出する)
    - Triplet loss(ある画像ベクトルに対して、Positve画像ベクトル間の距離とNegative画像ベクトル間の距離の差分を比較し、0以下になるように収束を行う損失関数。)
    - Neural style transfer(2つの画像の合成を行う。Content CostとStyle Costの２種類のコスト関数により損失関数の計算を行う。)
    - Content Cost(対象とするコンテンツ画像と、生成画像の活性化関数の差を取るため、最小化をすると生成画像がコンテンツ画像をより反映させたものとなる)
    - Style Cost(対象とするスタイル画像と、生成画像の活性化関数をグラム行列により計算した上で差を取るため、最小化をすると生成画像がスタイル画像をより反映させたものとなる))
- 苦労した点：Neural style transferの課題にてstyle costが期待する出力と合わず、非常に苦労をした。イメージのreshapeの方法を修正したところ解決。a_S=tf.reshape(a_S,[n_C,n_H*n_W])→a_S=tf.transpose(tf.reshape(a_S, ([n_H*n_W, n_C])))。

##5.Sequence Models
- 期間：10日間
- 全体的な所感：現職では自然言語処理に関わることが多いため、この章に出てきたRNN、LSTM、W2V、感情分析、等は非常に興味深く勉強になった。３週目のAttentionモデルは、他の様々な記事を読んでいると自然言語処理×Deeplearningに携わる上では必須の知識ということだったが、正直この講座だけでは理解がしきれなかったため、他の書籍等によりキャッチアップをする必要があると感じた。他の章と同様に、わりと最新のトレンドが盛り込まれた内容であったと認識しているため、ここからさらにどのような勉強をしていくかの理解に繋がった。
- 苦労をした点：RNNやLSTMの概念を理解することは出来たが、kerasでの実装は慣れていないため苦労をした。全体像をイメージしながら何度もモデルを作成することで身についていくと思われる。

###1週目. Recurrent Neural Networks
- 期間：2日間
- 得られた点：
    - RNNの概要（前の層の活性化関数を次の層の入力にする。パラメータの表記方法。DeepLearning同様の勾配消失問題。）
    - 様々なRNN（One to Many→1つの入力に対して複数の出力、音楽生成など。Many to One→感情分析など。Many to Many→固有表現抽出や機械翻訳など。）
    - Language Model（文章に含まれる言葉の中で、前の言葉を活用して次の言葉の出現確率を予測する。プログラミング課題では恐竜の名前を予測するモデルを実装）
    - GRU、LSTM(Forget/Update/Output gate)、Bidirectional RNN、Deep RNNsのざっくりとした概要
    - kerasによるRNN/LSTMの実装方法。
    - Clipping the gradients(勾配が大きくなり過ぎなように、gradientの値を計算した後にし閾値を超えていたら、修正を行う。np.clip())
- 苦労した点：やはりkerasの実装に苦労をした。modelにinputをする必要のある変数を入力し忘れエラーにつまづく。

###2週目. Natural Language Processing & Word Embeddings
- 期間：３日間
- 得られた点：
    - Word Embdding(単語を数百次元のベクトルにより表現を行うことで、単語感の類似度などが表現できる)
    - Embedding Matrix(OneHotVectorとWordEmbddingの行列。全ての単語のベクトルをマトリクスにまとめている)
    - Word2Vec(大量の文章から単語間の類似度を算出し、各単語のベクトルを算出するモデル。Skip-GramとCBoWの２種類がある。)
    - Negative Sampling(W2Vをより高速に学習するための手法。)
    - Sentiment Classification(口コミのレビュー分析など、自然文から特定の感情を分析する分類手法)
    - コサイン類似度（2つのベクトル間の類似度を-1~1の間で算出できる。単語ベクトル感の類似度を算出するのに良く用いられる。）
- 苦労した点：LSTMを活用し、文章に対して適切な絵文字を予測するモデルを構築する課題だったが、LSTMモデルが100％理解できておらず、実装につまづいた。

###3週目. Sequence models & Attention mechanism
- 期間：5日間
- 得られた点：
    - Machine Translation(文章が入力された場合に、異なる言語での文章を予測する。１週目の言語モデルでは単語毎に次に出現する単語を予測していたが、MachineTranslationの場合は全ての文章が入力された後に単語の予測を行う)
    - Beam Search Algorithm(探索空間において評価が高い順から選択をしていくアルゴリズム。機械翻訳において予測候補となる文章は膨大にあるため、Beam Searchを用いてより最適解に近い文章を予測する。)
    - Beam Searchにおけるエラー分析
    - Attention Model(複数のベクトルがあった時に、どのベクトルを重要視するかも含めて学習させる仕組み。通常のSeq2Seqモデルでは入力文章前半の情報が反映されづらくなってしまう。)
- 苦労した点：聞いた事が無い分野であり、かつ内容が難しく英語字幕のため、曖昧な理解のまま終わってしまった。


# その他参考サイト
このコースを受講するにあたり、下記を読ませて頂きましたので、ご紹介します。
自身がコースの受講を始める前に参考にさせて頂いた点もあるので、是非ご覧ください！

[Python覚えて3ヶ月の素人がCoursera Deep Learning Specializationを1週間で完走した話](https://qiita.com/koshian2/items/116ebd6ae5dcb73e655c)
[CourseraのAndrew Ng氏によるDeep Learning Specializationを受講して](http://p-baleine.hatenablog.com/entry/2017/12/22/202720)

最後までお読み頂き、ありがとうございました。