機械学習素人がUdemyの講座を見てAIチャットボットを作った話

## はじめに
この記事は、今年から機械学習を始めた素人が、Udemy講座 [自然言語処理とチャットボット：AIによる文章生成と会話エンジン開発](https://www.udemy.com/course/ai-nlp-bot/learn/lecture/13706156#overview) で学習してAIチャットボットを作った過程の共有と講座の宣伝ですｗ

## 自己紹介
[okapee0608](https://twitter.com/okapee0608)でTwitterやってます。
普段は東京都内でITコンサルをやってますが、プログラムは全然組まないので趣味でPythonやFlutterを触ってます。

ぜひ、気軽に絡んでいただけると嬉しいです！ 飲み友も募集中ですｗ

## 受講した講座のタイトル
 [自然言語処理とチャットボット：AIによる文章生成と会話エンジン開発](https://www.udemy.com/course/ai-nlp-bot/learn/lecture/13706156#overview) 

## 受講前の知識・技術レベル
Pythonについては基礎的なところは一通り学んでいました。
一冊だけ、素敵な書籍を紹介しておきます。Pythonは初めての方もあまりあれこれ手を出さず、この1冊をしっかり読みばいいのではないでしょうか。
Udemyの本講座にもPython基礎のセクションがあるので、そちらも併せて学ぶとGoodです。

[Python実践入門](https://www.amazon.co.jp/Python%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E3%81%AE%E5%8A%9B%E3%82%92%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%97%E3%80%81%E9%96%8B%E7%99%BA%E5%8A%B9%E7%8E%87%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B-WEB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/429711111X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=python%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1607642310&sr=8-1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32777/9e34a732-0a1d-3eb9-bffb-46ff1c8712ce.png)

上述のとおり、機械学習については、今年、ほぼゼロからはじめました。
まずは数学がまったくわからなかったので、数学は本講座外で勉強しました。使った教材は主に以下のようなものです。

[人工知能プログラミングのための数学がわかる本](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%AD%A6%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E7%9F%B3%E5%B7%9D-%E8%81%A1%E5%BD%A6-ebook/dp/B079TLRZ8K/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92+%E6%95%B0%E5%AD%A6&qid=1607636920&sr=8-3)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32777/267ac64b-30dc-bb8c-c644-823f2c81eab3.png)

[やさしく学ぶ 機械学習を理解するための数学のきほん アヤノ＆ミオと一緒に学ぶ 機械学習の理論と数学、実装まで](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%AD%A6%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%82%A2%E3%83%A4%E3%83%8E%EF%BC%86%E3%83%9F%E3%82%AA%E3%81%A8%E4%B8%80%E7%B7%92%E3%81%AB%E5%AD%A6%E3%81%B6-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E6%95%B0%E5%AD%A6%E3%80%81%E5%AE%9F%E8%A3%85%E3%81%BE%E3%81%A7-%E8%B3%A2%E5%90%BE%EF%BC%88LINE-Fukuoka%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%EF%BC%89-ebook/dp/B075GSMZDS/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92+%E6%95%B0%E5%AD%A6&qid=1607636920&sr=8-1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32777/13663737-88ab-0818-39c4-656c0d1c5588.png)

本講座にも数学のセクションがあるので、それだけでも本講座をある程度は理解できるかと思いますが、機械学習をしっかり学びたいのであれば行くゆくは数式の荒波に立ち向かうことになるかと思いますので、本講座前後では取り組んでおくのが吉かと思います。

ここで挙げた2冊は、数学が苦手な私のような人間でも読めたので、気合と根性ｗがあれば読めると思います。躓いてもググりながらなんとか最後まで読みましょう。逆にこのあたりで諦めてしまうようだと、この先の未来はあまり明るくないように思います。（優しく言うこともできますが、私のように社会人になってから機械学習に取り組む人間は、アカデミックにずーっとこの分野に専門で取り組んできた方々に少しでも近づくには相当な努力がいるはずなんです…　残念ですが…）

加えて、AIには統計的な知識も必要なので、統計検定2級を取得しました。（2級といえど、私にはけっこう難しかったです）

機械学習関連の本では、おなじみの「ゼロつく」を2冊読みました。
非常に評判の良い本で、実際に読んでみても本当に分かりやすかったです。TensorflowやKeras、Pytorchなんかを学ぶような本ではないので、これを読んで直ぐになにか作れるかっていうとNOなんですが、機械学習の動作原理を理解するにはマストではないでしょうか。

[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B&qid=1607637400&sr=8-1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32777/e240b3dd-d942-b1d4-b972-7ebed6a3cf2f.png)

[ゼロから作るDeep Learning ❷ ―自然言語処理編](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E7%B7%A8-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873118360/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B&qid=1607637400&sr=8-3)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32777/6aa0b34f-9e15-3278-5a62-445e93a61e73.png)

私がこのUdemy講座を始めるまでにやったことはざっくりと以上です。


### どんな講座だったか
抜粋すると、以下のようなことが学べる講座です。
> - 自然言語処理（NLP）の本質を理解し、コードが書けるようになります。
- 夏目漱石、宮沢賢治、江戸川乱歩風のテキストの自動生成について学びます。
- リカレントニューラルネットワーク（RNN）による自然言語処理を学びます。
- チャットボットなどに利用可能な、対話文の自動生成について学びます。
- 自然言語処理を、チャットボットの開発につなげる方法を学びます。
- LSTM、GRU、Seq2SeqなどのRNNの発展形について学びます。

## 何を得たか
講座の流れに沿って学習していくと、江戸川乱歩風のテキスト生成ロジックが開発できるようになりました。
その過程で、LSTMやGRUの動作原理の理解を深めることができました。
ただ、正直、この講座だけで動作原理を完全に理解できたかというとそうではありません。参考になったページも紹介させていただきます。

- 【データ分析実践】RNNを使って文章生成を実装してみる | 楽しみながら理解する自然言語処理入門 https://data-analytics.fun/2020/04/04/generating-sequences/
- Kerasの使い方まとめ【入門者向け】 https://sinyblog.com/deaplearning/keras_how_to/#i-7
Keras LSTMでサクッと文章生成をしてみる | cedro-blog http://cedro3.com/ai/keras-lstm-text/
- NLP(自然言語処理):メモリに乗らない大きなデータを分割して訓練する | mm参考書 https://mmsankosho.com/nlp-8/
- 挑戦！ word2vecで自然言語処理（Keras＋TensorFlow使用） (1/2)：ディープラーニング習得、次の一歩 - ＠IT https://www.atmarkit.co.jp/ait/articles/1801/30/news139.html
- 【Python】Word2Vecの使い方 - Qiita https://qiita.com/kenta1984/items/93b64768494f971edf86
- gensimのWord2Vecを使ってみる。 - どん底から這い上がるまでの記録 https://www.pytry3g.com/entry/gensim-word2vec-tutorial#Wikipedia%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89
- kerasでSeq2Seqモデル実装を数式なしで解説【入門者向け】 https://sinyblog.com/deaplearning/seq2seq-001/
- 【翻訳技術】seq2seqを実装しながら理解してみた - omathin blog https://omathin.com/2020/05/17/seq2seq-study/

あとは私みたいに、Tensorflowってなんじゃらほい？みたいな方は、公式の[チュートリアル](https://www.tensorflow.org/tutorials/quickstart/beginner)をやってみるのが良いかと思います。

この講座を始めるまでは、前述のゼロつくを読んでLSTMやGRUを理解したつもりでいたのですが、いざ実装！となると腰が重く、「理解してるからええやろ」みたいなところがありました。いざ実装してみると、モデルの構築はパズルのようでとても面白く（モデルの各レイヤに流れていく行列の次元を揃えていく作業が私にはパズルのように感じました）、また、環境構築や行列計算などで大量のエラーを吐くのでやりがいもあります（やりがい、は大ウソ！？ ですが、エラーを解消したときの謎の達成感はすごいですｗ）。

環境構築、特にTensorflowとKerasの導入ではけっこうな人がバージョンの組み合わせ等のエラーで悩まされるのではないかと思います。GPU版を使うのであれば尚更です。ここらへんで死にたくなったらおとなしくGoogle Colaboratoryを使いましょう。なんと！無料で高性能なマネージドサーバが使えます。
そして、1,000円／月程度で[Colab Pro](https://colab.research.google.com/signup)が使えます。こちらはより高性能なGPU／TPUを定額で使えるという驚異的なサービスです。これで、「自分のPCは性能が悪いから…」と言い訳はできませんね^^; どうしてもローカルでやりたい場合はDockerでそれっぽいイメージをpullして利用させていただくのが良いかと思います。

## 受講してよかった点
### Pythonの基礎から中級者レベルの自然言語処理まで幅広く学べる
私はPythonの基礎レベルは理解している（つもり）なので流し見でしたが、NumpyやMatplotlibの基礎も含め、全体を丁寧に解説してくださるので復習になりました。Pythonが初めての方でも躓かないように環境構築と基礎を丁寧に解説している点は素晴らしいと思いました。

ニューラルネットワークについても動作原理をしっかりと説明してくださるので、躓きやすいバックプロパゲーションも分かった気にはなれますｗ ただしあくまで分かった気になるだけなので、前述のゼロつくも併せて学習すると良いかと思います。

自然言語処理については、前処理に始まり、Word2Vecを用いた入力のベクトル化、Keras＋TensorflowでのLSTMやGRUの実装等の一連のワークフローを、JupyterNotebookを用いて説明してくれます。このあたりは実際の業務でも同じようなワークフローになるかと思いますので、とても勉強になります。

### 複数の環境で動作するチャットボットを開発することにより応用が効く

実際に動作するモデルを作ったら、それに対してどのようにInputデータを与えるかというアプリケーションレベルの話になってくるかと思います。モデルを作って終わりという講座やWebページの解説が多いのですが、本講座は一気通貫でそこまで踏み込んでいます。

複数の、と言いましたが、２つです。

ただし、Jupyter Notebookに留まらずにコマンドラインからもInputを与えてOutputを得るボットが作れるということは、いろんな可能性を垣間見ることができます。

実際に私はコマンドラインでInputを与えてOutputを得る様子を見て、コマンドラインをLINEに置き換えたら多くの人に使ってもらえるのでは？と思い、LINEをI/Fにした対話Botを開発しました。（後述します）

## 効果的に講座を受講する際のポイント
### 写経して終わり、ではない
最悪なのはサンプルコードを動かしておわり、なのでそれよりは写経してるだけマシやろ！という感じではあるのですが、どうせなら少しくらいはサンプルコードをイジってオリジナル感を出すと、友達にも自慢できるかと思います。

私はI/FをLINEとし、LINEのMessaging APIを使って対話Botを作りました。Herokuの無料プランで動かしているので止まっていたり、デプロイにミスって死んでたりするのでまだまだですが、GitHubは[こちら](https://github.com/okapee/aidialog)です。

コーパスも、江戸川乱歩と対話しても面白くないと個人的に思ったので、[BTSJ日本語自然会話コーパス](
BTSJ日本語自然会話コーパスについて | 宇佐美まゆみ研究室)というものを使わせていただきました。利用目的を申請すれば（不適切な利用目的でなければ）どなたでも利用できるかと思います。


## 受講のコツ
これは本講座に限らないのですが、受講する際には以下を徹底すると効率的です。

### 速度調整拡張機能を使う
[Video Speed Controller]というChrome拡張を使うと、動画再生中にスピードをキーボードで変更できます。スピードを上げたいときは「I」、下げたいときは「D」を押せばOKです。この拡張機能により、非常に効率的に講座を終えることができました。(https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk?hl=ja)

### 必要ないところは適当に終わらせる
上述の拡張機能と被りますが、全部が全部、きっちり最後まで見る必要はないと思います。動画教材のキツイところとしては、書籍のようにリファレンス的に引けないところかと思いますが、上記拡張機能などを駆使して必要な箇所だけを重点的に、繰り返し見るようにすると学習効率／効果も高まるのではないでしょうか。