MicrosoftのDeep Learningライブラリ「CNTK」チュートリアル

CNTKってご存知でしょうか？[CNTK](https://www.microsoft.com/en-us/research/product/cognitive-toolkit/)は、Microsoftが主導して開発しているオープンソースのDeep Learningライブラリです。正直なところ僕も最近使い始めたのですが、この[CNTK](https://www.microsoft.com/en-us/research/product/cognitive-toolkit/)、良い意味でMicrosoftらしくなく、なかなかイケているんじゃないかと思っています。今回は、まずCNTKの特徴をざっと紹介し、[後半でコード例をJupyter Notebookを使って見ていきます](http://qiita.com/usuyama/items/bb7600ab7cfc1f5b8be3#python%E3%81%A7cntk%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)。

**[チュートリアルはこちら](http://qiita.com/usuyama/items/bb7600ab7cfc1f5b8be3#python%E3%81%A7cntk%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)**

![cntk.png](https://qiita-image-store.s3.amazonaws.com/0/34199/c8eb2d9b-6e55-d462-7778-eec475ec46f4.png)

# "Microsoft"にこだわらない、オープンな開発方針
## Open Source

https://github.com/Microsoft/CNTK

GitHub上で開発が進んでいます。社内版はありません。

[公式wiki](https://github.com/Microsoft/CNTK/wiki)

## Python と C++ API
- [Python API](https://www.cntk.ai/pythondocs/)
- [C++ API](https://github.com/Microsoft/CNTK/wiki/CNTK-Library-API)

.Net APIは(まだ)ありません。[Brainscript](https://github.com/Microsoft/CNTK/wiki/Using-CNTK-with-BrainScript)もサポートされています。

## LinuxとWindowsで利用可能

"Both Linux and Windows are first citizens of CNTK" と開発チームは言っていました。多少の時間差は出るかもしれませんが、両プラットフォームで同じ機能がサポートされるようです。[Linux向けにはDockerも用意され](https://github.com/Microsoft/CNTK/wiki/Setup-CNTK-on-your-machine)ているので、もしかしたらLinuxの方が利用しやすいかもしれません。

![ms_loves_linux.png](https://qiita-image-store.s3.amazonaws.com/0/34199/61f193f9-5f3b-b888-6c82-6f085d02901d.png)

# 高速&スケール

## 複数のGPUでスケールする

Therano、 TensorFlow、 Torch 7、 Caffeと性能を比較した図です。Fully connectedな4層ニューラルネットワークを、一秒あたり何フレーム処理できるかが比較したものです(minibatchサイズは8192)。青とオレンジの設定は、それぞれGPU(Nvidia K40)が1つまたは4つのLinuxマシン、緑は2台のLinuxマシン(2 x 4 GPU)のクラスタです。**GPUが1つの場合は各ライブラリでほとんど変わらない速度 (TensorFlowよりはCNTKが速い?)ですが、複数のGPUを効率的に活用できているのはCNTKだけです。**4 GPUの時に、CNTKはほぼ4倍にスケールしていますが、Torch 7とCaffeは2倍程度に収まっています。TensorFlowはほとんど変わりません。

![speed-comparison.PNG](https://qiita-image-store.s3.amazonaws.com/0/34199/8d999b5b-aa86-eb6e-1259-b68985ff3c67.png)
[Microsoft Research ブログ](https://www.microsoft.com/en-us/research/blog/microsoft-computational-network-toolkit-offers-most-efficient-distributed-deep-learning-computational-performance/)

## 2016年10月: CNTKによって、音声認識精度が人間レベルに到達

2016年10月の実験で、Microsoftのチームが開発した音声認識エンジンがエラー率 (word error rate) 5.9%を記録しました。これは同じ音声ファイルをプロの文字起こしサービスに依頼した場合と同等でした。しかも、今回の文字起こしサービスでは、二段階処理をしており、一人目が1から文字起こしをし、二人目が修正を加えています。

手法の詳しい部分は[論文](https://arxiv.org/abs/1610.05256)が出ていますが、非常にレイヤー数が多いニューラルネットワークを使っています。ここでもCNTKがパワーを発揮していて、CNTKの高速な処理が不可欠だったと[論文](https://arxiv.org/abs/1610.05256)でも述べられています。

![speech-graphic.jpg](https://qiita-image-store.s3.amazonaws.com/0/34199/d993a746-a406-64b3-881d-e7b41daa292a.jpeg)
- [Historic Achievement: Microsoft researchers reach human parity in conversational speech recognition
](http://blogs.microsoft.com/next/2016/10/18/historic-achievement-microsoft-researchers-reach-human-parity-conversational-speech-recognition/#sm.000004s3i4idkqdy1qzs6hpiuqlmf)
- [Microsoft researchers achieve speech recognition milestone](http://blogs.microsoft.com/next/2016/09/13/microsoft-researchers-achieve-speech-recognition-milestone/#sm.000004s3i4idkqdy1qzs6hpiuqlmf)

# PythonでCNTKを使ってみる

[CNTK入門 (Python)](https://notebooks.azure.com/library/cntkbeta2_ja)

同僚が良いチュートリアルを作っていたので、翻訳させてもらいました。Jupyter Notebookになっているので、環境整備することなくその場でコードを編集・実行できます。順次、追加していく予定です。

- [CNTK 101: Logistic Regression と機械学習への導入](https://notebooks.azure.com/library/cntkbeta2_ja/html/CNTK_101_LogisticRegression_ja.ipynb)
    - まずは線形モデルを作って、簡単な2クラス分類問題を解いてみます。モデルの構築、学習から評価まで一通りの流れを紹介しています。コードを追うだけではなく、背後の数理についても簡単に紹介しています。
- [CNTK 102: Feed Forward Networkでシミュレーションデータの学習](https://notebooks.azure.com/library/cntkbeta2_ja/html/CNTK_102_FeedForward_ja.ipynb)
    - 4層のニューラルネットワークを作り、101と同じシミュレーションデータを学習します。
    - <img width="289" alt="feedforward_network.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/34199/08033694-da1b-6b9b-3fc4-d07f1c107ca8.jpeg">
- [CNTK 103 Part A: MNIST (手書き数字) データの用意](https://notebooks.azure.com/library/cntkbeta2_ja/html/CNTK_103A_MNIST_DataLoader_ja.ipynb)
    - Part AではMNISTデータをダウンロードし、使いやすい形に変換してファイルに保存します。
    - ![mnist_originals.png](https://qiita-image-store.s3.amazonaws.com/0/34199/4d566dc6-e134-6409-07d9-1461f02c090a.png)

- [CNTK 103 Part B: MNISTデータをFeed Forward Networkで学習](https://notebooks.azure.com/library/cntkbeta2_ja/html/CNTK_103B_MNIST_FeedForwardNetwork_ja.ipynb)
    - 102で作った4層ニューラルネットワークで、Part AでダウンロードしたMNISTデータを学習します。

## Jupyter Notebook (Azure Notebook)
Microsoftアカウントでログインすると、ノートをクローンして、編集・実行できるようになります。
![azure_notebook.png](https://qiita-image-store.s3.amazonaws.com/0/34199/32509769-57b8-138a-4064-985dce3d6014.png)

その場でコードを変更して実行できるのはとても便利なので、是非チュートリアル上のコードを変更して遊んでみてください。

![jupyter_run_cell.png](https://qiita-image-store.s3.amazonaws.com/0/34199/49532549-3728-48c3-e2c8-aad66b43784a.png)

# 参考
- ローカルに環境を用意したい場合は[公式](https://github.com/Microsoft/CNTK/wiki/Setup-CNTK-on-your-machine)か[こちら](http://qiita.com/hiiyan0402/items/ec41908f2aa81b73047e)の記事が参考になりそうです。
- (まだ試してないですが) [Azure上に環境を用意する](https://github.com/Microsoft/CNTK/wiki/CNTK-on-Azure)方が楽そうな気がします。GPUも使えます。