あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

TensorFlowをKubernetesで分散学習するためのKubeFlowを動かしてみた話

Kubernetesが機械学習基盤としてKubeflowをリリースしました。

ざっくりいうと、KubeFlowは以下の機械学習アプリケーション開発の一連のワークロードをサポートするOSSです。

f:id:dr_asa:20171215162737p:plain

  • モデル開発基盤

データサイエンティストや機械学習エンジニアがJupyterNotebookをつかってモデル開発するための、Jupyterが動くサーバ環境を提供

  • TensorFlow分散学習基盤

開発したモデルをTensorFlowで分散学習するためのKubernetesクラスタを自動生成

  • アプリ公開基盤

学習済みモデルをKubernetesクラスタ上でサービス公開する基盤を提供(Tensorflow Serving)

github.com

まだ、開発途中、かつざっとしか追えていませんが、導入のしかたと概要をまとめます。

0. kubeFlow環境構築

Kubeflowを動かすためには、まずKubernetesクラスタを構築しなければいけません。 今回は検証のためなので、雑にminikubeを使っています。

手順は以下のとおりです。

minikubeのインストール

MacOSのときは、次のコマンドでminikubeをインストールします。

$ brew cask install minikube

Kubernetesクラスタの構築

次のコマンドを実行して、Kubernetesクラスタを構築します。

$ minikube start
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

バージョンは次の通りです。

$ minikube version
minikube version: v0.24.1

$ kubectl get node
NAME       STATUS    AGE       VERSION
minikube   Ready     10m       v1.8.0

これで準備は完了です。

なお、基本的人権を満たさないPCを使っているみなさまと プロキシ環境で無駄に人生を消耗しているみなさまは AWSやAzureやGCPなどのパブリッククラウドVMかKubernetesマネージドサービス使ってください。

Kubeflowのインストール

KubeflowはGitHubで公開されていますので、次のコマンドでクローンします。

$ git clone https://github.com/google/kubeflow

ここでは、CPUを使って分散学習する例を説明します。 次のコマンドを実行して、環境を構築します。

$ cd kubeflow
$ kubectl apply -f components/ -R

なお、KubeflowはGPUもサポートしています。正確には、Kubernetes1.8からGPU対応がα提供されているので、Nvidia CUDAなどで後日動かしてみたいとおもいます。

環境構築のためのマニュフェストファイルは、kubeflow/components配下にあります。

1. モデル開発基盤

KubeFlowではモデル開発のため、JupyterNotebookが動作する環境が用意されます。 KubeFlowは、JupyterHubを使用しています。なので複数のユーザーでの認証アクセスを管理でき、「spawners」と呼ばれるプラグイン可能なコンポーネントをつかってます。

JupyterNotebookはKubernetesのPodで動きます。

$ kubectl get pod
NAME                                                READY     STATUS    RESTARTS   AGE
~中略~
tf-hub-0                                            1/1       Running   0          2h
tf-job-operator-5c648c58bc-vrtcx                    1/1       Running   0          2h

JupyterNotebookにアクセスするためのPodは「tf-hub-lb」という名前のServiceがLoadBaranceとして公開されています。

tf-cnn $ kubectl get svc
NAME                                          CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
~中略~
tf-hub-0                                      None             <none>        8000/TCP         2h
tf-hub-lb                                     10.107.227.23    <pending>     80:32089/TCP     2h

minikubeの場合は、次のコマンドで公開URLを確認できます。

$ minikube service tf-hub-lb --url
http://192.168.99.100:32089

f:id:dr_asa:20171215131202j:plain

カスタムのJupyterNotebookを使いたいときや構成を変更したいときは、以下のマニュフェストを修正します。 kubeflow/components/jupyterhub/manifests/

2. TensorFlow分散学習基盤

チュートリアルや書籍のサンプル程度のモデルであれば、 使っているPCやクラウドVMのシングルインスタンスで大丈夫ですが 実務で使うような大規模なものであれば、計算量も膨大になるため、(コストを見ながら)計算基盤をスケールさせる必要があります。

TensorFlowの分散学習処理を行う際は、3種類のノードをつかいます。

  • Master
  • Parameter Server
  • Worker

Kubeflowでは、Kubernetesクラスタをつかって分散クラスタを構成し、その上でTensorFlowの分散処理コードを動かす環境が用意されています。

MasterとParameter Serverは1〜2ノード、Workerは計算に必要な沢山のノードが動きます。

Kubeflowのサンプルコードが用意されているので次のコマンドで実行します。 このサンプルは、tf_cnn_benchmarksを使用して畳み込みニューラルネットワークを学習するためのものです。

ソースはこちらですね。

benchmarks/scripts/tf_cnn_benchmarks at master · tensorflow/benchmarks · GitHub

次のコマンドでKubernetesクラスタにJobを投入します。

$ cd kubeflow/tf-controller-examples/tf-cnn/
$ kubectl create -f tf_job_cpu_distributed.yaml 
tfjob "inception-171202-163257-cpu-3" created

しばらくすると、次のようなPodが生成されます。

kubectlコマンドで確認すると、inception--master-/inception--ps-がそれぞれ1つずつ inception--worker-が3つできているのがわかります。

$ kubectl get pod
NAME                                                READY     STATUS              RESTARTS   AGE
inception-171202-163257-cpu-3-master-vjo4-0-hc2kl   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-ps-vjo4-0-728vm       0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-0-h66bn   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-1-lcljx   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-2-j59bh   0/1       ContainerCreating   0          18s
model-server-6598c6486d-b8rxg                       1/1       Running             1          6m
model-server-6598c6486d-clwz9                       0/1       Pending             0          6m
model-server-6598c6486d-dkmsk                       0/1       Pending             0          6m
tf-hub-0                                            1/1       Running             1          6m
tf-job-operator-5c648c58bc-47c7f                    1/1       Running             1     

KubeFlowでつかうマニフェストファイルは以下のようになっています。 ポイントとなるところだけ抜粋します。

apiVersion

apiVersionで「tensorflow.org/v1alpha1」を、kindで「TFJob」を指定してます。 kindは「Job」ではないので注意です。

apiVersion: tensorflow.org/v1alpha1
kind: TfJob
Master Pod

MasterのPodをreplicaSpecsで指定します。 実行したいジョブのコマンドやパラメータの指定で、通常のKubernetesマニュフェストファイルと同じですが [tfReplicaType]を「MASTER」にしています。 また、[replicas]が1なので、Podが1つ上がります。

spec:
  replicaSpecs:
  - replicas: 1
    template:
      spec:
        containers:
        - args:
          - python
          - tf_cnn_benchmarks.py
          - --batch_size=32
          - --model=resnet50
          - --variable_update=parameter_server
          - --flush_stdout=true
          - --num_gpus=1
          - --local_parameter_device=cpu
          - --device=cpu
          - --data_format=NHWC
          image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: MASTER
Parameter Server

同様にParameter ServerのPodを定義しています。 Parameter Serverは[tfReplicaType]が「PS」で [replicas]が1なので、Master同様Podが1つ上がります。

  - replicas: 1
    template:
      spec:
        containers:
        - args:
          ~中略~
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: PS
  tfImage: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
Worker Pod

最後に計算Podです。 Parameter Serverは[tfReplicaType]が「WORKER」で [replicas]が3なので、計算用Podが3つ上がります。

  - replicas: 3
    template:
      spec:
        containers:
        - args:
          ~中略~
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: WORKER

この構成で分散して学習が行われます。

今回はKubernetesクラスタをminikubeで構成していますが、たとえばGKEなどをつかうときは、NodePoolを構成して、プール内に適切なスペックのノードをおけばよいかとおもいます。

TensorFlowの分散学習の実装については、enakaiさんのブログがわかりやすいです。

分散学習用TensorFlowコードの書き方 - めもめも

3. アプリ公開基盤

KubeFlowのアプリ公開には、Tensorflow Servingが使われています。 今回は、minikubeで確認したので試してませんが GCPなどでクラスタを構成して 学習済みのモデルをGCSにアップロードしてアプリで利用する流れです。

github.com

DevFest2017で、「プログラマのためのGoogle Cloud Platform超入門」というタイトルで GKEを簡単に紹介するセッションをさせていただきましたが そこで、TensorFlowで画像推論する基盤をデモとして動かしました。

ほぼ、同じようなアーキテクチャなのでご参考までに。

感想

世間やメディアで大変な賑わいをみせている深層学習界隈は、人間がAIに仕事を奪われるたぐいのファンタジーからはじまり、 クールなアルゴリズムの話題、論文を実装してみました速報、ツール/フレームワークを使ってみました日記や 深層学習でこんなすごいことできました選手権などの情報にあふれ、とてもきらきらまぶしく膨大過ぎて追いかけきれてないのですが、、、、

このような基盤構築や地味な方法論は、とても楽しいので、細々と調べながら手を動かしたいと思いました。

まだ開発途中のようですが、ひそかにウォッチしたいとおもいます。

おわり

GTC Japan 2017(@NVIDIA) に参加しました

2017/12/12(火)~12/13(水)にお台場ヒルトン東京で開催された、NVIDIA主催 GTC Japanに参加しました。 昨今のAIブームによる大変な賑わいで、かなり人に酔ってしまいましたがとても興味深いセッションや展示がたくさんでした。

簡単ですが、ログを記録です。

TensorFlow:Open Source Machine Learning

Google.Inc Wolff Dobson

ML/DLのオーバービュー/TensorFlowとは何か?

TensorFlowの動作環境

  • CPU/GPU/TPU/Android/iOS/IoT
  • NVIDIA CUDA/Intelで動作

    TensorFlow Eager Execution

  • Define-by-Runでモデルを記述できるパッケージ
  • モデルのデバッグが容易
  • インストールはpip install tf-nightly
  • GPUも使える
  • コードはかなり楽に書けるが、パフォーマンスはよろしくない

    TensorFlow Lite

  • Android向けTensorFlowライブラリ
  • Flatbuffersでシリアライズ(ゲーム向けのもの)
  • バイス用でモデルを動かすためバイナリが10分の1
  • ハードウエアアクセラレーション有(Android Neural Network APIなど)

    Magenta ProjectおよびSketch-RSSの紹介

TensorFlow Liteのアーキテクチャ概要 f:id:dr_asa:20171214153234j:plain

TensorFlow LiteのデモをするGooglerをTensorFlow Liteを使って実装したAndroidアプリで推論したところ f:id:dr_asa:20171214153604p:plain

CUDA9 Deep Drive

エヌビディア合同会社 成瀬さん

CUDA9とは

  • Volta対応/Tesla V100/Tensorコアオーバービュー

    Volta対応

  • Voltaアーキテクチャ概要
  • NVLink(300GB/sec)/VoltaMPI対応
  • DLだけではなくHPCでも使用

    Tensorコア

  • 4×4の行列を1サイクルで計算
  • 16×16行列を32スレッドで協調実行
  • 行列積算のためのテンプレートを容易
  • WMMAテンプレートでTensorコア用のデータ型を用意
  • WMMA:ロード命令
  • WMMA:行列乗算
  • WMMA:ストア命令  など
  • WARP同期用ビルドイン関数あり

    cuTLASS(ver0.1)

  • CUDAカーネルが使用できる高性能な行列積テンプレート(DL向け)

    Cooperative Groups

  • スケーラブルで柔軟性の高いスレッド間同期通信機構
  • 協調動作するスレッドグループの定義/分割同期が容易にできる
  • スレッドブロック内/シングルGPU内/マルチGPU間それぞれで使える
  • マルチグリッドグループは粒子シミュレーションや時間発展系の演算で使う

    その他開発ツールおよびライブラリの改善

Deep Lerning with Apache MxNet and Gluon

Amazon Web Services Inc Sunil Mallya/Joseph Spisak

"AI is the new Electoricity"

  • あらゆる産業でデータサイエンスが進む。メディアだけでなく医療/ファイナンス/カスタマーエクスペリエンスなど
  • データサイエンティストの仕事を楽にすることがAWSの目的
  • (インフラ)-(フレームワーク)-(プラットフォーム)-(サービス)すべてのレイヤーでサービスを提供する

    Amazon SageMaker

  • MLモデルを大規模に構築/トレーニング/デプロイするためのサービス
  • MLはデータ前処理やトレーニングだけでなく、継続してアプリをデプロイすることが重要(かつ、難しい)
  • フレームワークアルゴリズムを選択可能(Apache MXNetやTensorFlowなど)

    DeepLens

  • 開発者向けの画像推論用カメラ
  • review

    Gruon

  • DL用のフレームワーク(API?)
  • Microsoftと協業
  • Apache MXNet/Caffe2/CNTKなどを選べる
  • 分散学習も可能
  • 文法はPythonに酷似(デモを見たけど非常に簡潔だった)
  • Github上にCNNやRNNのサンプルがある

    その他ビデオ認識/音声認識/翻訳などのAPIも公開

    AWSの強固なパートナー戦略

  • エンタープライズ顧客での導入事例
  • 日本国内でも展開(開発者の教育に力を入れる)
  • 特にMLに関してはMicrosoftとの協業を強調

AI・ビックデータ技術の最先端の研究開発・社会実装を加速する計算基盤 東工大TSUBAME3.0

東京工業大学 松岡先生/国立研究開発法人産業技術総合研究所 小川さん

スパコンに求められるもの(社会基盤)

TSUBAMEの歴史

  • 2000年~15年にわたり開発
  • 2011年にGordon Bell賞受賞

    ABCIの紹介

  • ラージスケールAI向けスパコン
  • アカデミアと産業のコラボによる開発
  • 東京大学柏キャンパスに建築中
  • ペタバイト級大規模モデリングをサポート
  • 2018年春~夏にリリース予定
  • 1088台の計算ノード 4352GPU
  • 富士通2U2サーバ NVIDIA TeslaV100 Infiniband
  • 1ラックで1PFLOPS
  • Water/Air Hybrid Cooling Systems
  • ソフトは今後公開予定

大規模有限要素解析とAIによるモンテカルロ地震動強度分析

東京大学 藤田先生

SC17でBest Poster Award受賞

研究概要

  • HPCによる地震動の有限要素解析による物理シミュレーションを行った結果画像をもとに、DLを使って学習を行い地震対策シナリオを作る
  • レイヤー化された地盤構造データを用意
  • 地底内部はあいまいさがあるのでモンテカルロシミュレーション
  • 10km×10kmを50mの分解能で解析
  • 非線形波動方程式を解くため大規模な計算が必要
  • 計算を安定化させるため陰解法を採用

有限要素解析

  • 京コンピュータ(理研
  • 10.6PFLOPS
  • ソルバーは自作(前処理方程式を荒く解くことで共役勾配法を使う)
  • 行列ベクトル積の高速化のため、非構造格子を構造格子にする

DLによる推論

  • 8350m×7200mで50mの分解能で20段階で壊れやすさを評価するAIを作成
  • 24360データセット使用(一部テストセット)
  • Chainerで実装
  • シミュレーションのような精度はでないもののそこそこの推論が可能
  • 計算量がシミュレーションに比べはるかに少ないので有用

解くべき波動方程式 f:id:dr_asa:20171214153752j:plain

感想

セッションの数はDLメインでしたが、HPCブースの賑わいは熱くどのセッションも満席立ち見でした。 企業ブースは日本HPやIBMDellなどのハードウエアベンダーだけでなく、RedHatやシスコ、またHPC系のソルバーを扱うベンダーや仮想化ソフトウエアのベンダーなども出展されていていました。 クラウドベンダーではAWSの出展がありましたが、休憩時間ではブースに近寄れないほどの大盛況ぶりでした。

昨今のAIブームはやや過熱気味なところもあるかもしれませんが、HPCやDLなどの高度な数理を必要とする技術はこれからますます重要になってくるので、しっかりウォッチしたいなと思いました。いやいやいやいや、ウォッチするだけではなく自分でコードを書く必要があるなと。

あと、(やはり)アカデミックからの発表が多く、イケてる勉強会は学会、イケてるハンズオンは大学の講義、イケてる書籍は大学の教科書なのだよなと。高度な応用技術・最先端の実装を理解するための、基礎が大事だと改めて。

最後に、心ときめいた♥写真の数々です。 f:id:dr_asa:20171214153844j:plain f:id:dr_asa:20171214154512j:plain f:id:dr_asa:20171214154536j:plain

Amazon Web Servicesのソリューションアーキテクトのみなさま、ご招待いただきありがとうございました😊

以上

機械学習を勉強するときはIDEっぽいJupyterLabを使うと便利

いまお仕事の関係で、機械学習の教科書的な書籍を読んだりオンライン講座を受講したりしながらサンプルやチュートリアルを動かして勉強しています。

以前にこちらのエントリーで機械学習の『勉強環境』としてJupyterNotebook/Dockerを使っています、というチラシの裏紙っぽいエントリを書いたところ、「Dockerのスペルが違うじゃないか、いい加減にしろ」というフィードバックを頂きました。

dr-asa.hatenablog.com

が、最近「JupyterLab」なるものがあると知り、これがなかなか便利なのでいつも使っています。 ということで、機械学習の勉強環境を構築するためJupyterLabの動くDockerイメージを作ったので、簡単にご紹介です。

1.JupyterLabとは

JupyterLabはJupyter Notebookをベースに拡張したIDEで、ブラウザで動作します。

色々な機能がありますが、まずなによりもターミナルが同一画面で使えるのが便利です。Google Cloud ShellやAzure Cloud Shellにすっかり慣れてしまったゆとりなので、ありがたい。

f:id:dr_asa:20171006121313p:plain

また、タブで画面分割ができチュートリアルやお手本のサンプルコードと自分の書いたコードを見比べながらチェックできるので、勉強環境にはぴったりです。 f:id:dr_asa:20171006120431p:plain

JupyterLabの公式リポジトリはこちらです。

github.com

2. JupyterLabを使うには

このJupyterLabを使えるDockerイメージ「asashiho/ml-jupyterlab」をDockerHubで公開していますのでそれをもとに、次のコマンドで「ml-container」という名前のDockerコンテナを起動します。 Dockerのインストールは、こちらで簡単に紹介しています。

コマンドのpオプションは、コンテナで転送するポート番号を指定してます。 ここでは、JupyterLabが8888番ポートを使っています。

$ docker run -p 8888:8888 --name ml-container -it asashiho/ml-jupyterlab

コンテナは、[Ctrl]+[C]で停止できます。

また、バックグラウンドで動いている場合は、次のコマンドでコンテナを起動/停止できます。

$ docker container start ml-container
$ docker container stop ml-container

コンテナは、次のコマンドで削除できます。

$ docker container rm ml-container

なお、コンテナを削除するとデータも消えますので、データを消したくないときは docker runコマンドでコンテナを起動するときに、Dockerのホストマシン(お使いのPCやクラウドインスタンス)をディレクトリをvオプションでマウントしてください。

Dockerコンテナが起動できたら、ブラウザから以下のアドレスにアクセスしてJupyterNotebookを使います。 アクセス先のURLは、docker runコマンドを実行したときのコンソールに表示されますので、パスに/labを追加してください。

クラウドインスタンスの場合は、以下のアドレスでアクセスできます。

http://DockerホストのIPアドレス:8888/lab?token=<your token>

MacOSまたはWindowsPCのローカル環境の場合は、以下のアドレスでアクセスできます。

http://localhost:8888//lab?token=<your token>

こんな感じです。

f:id:dr_asa:20171006121953p:plain

3. 環境をカスタマイズしたくなったときは

Dockerイメージは「Dockerfile」という定義ベースのファイルで実行環境の構成を管理しています。

このファイルをカスタマイズし、Dockerfileをビルドすることで、任意のDockerイメージを作成できます。たとえば、Pythonのバージョンを変えたい、TensorFlowを最新にしたい、足りないライブラリがあった、など。

今回お試しで使ったDockerイメージのもとになるDockerfileをGithubで公開してますので、ご参考までに。

github.com

無理のない、よい機械学習の勉強ライフを。

「機械学習の書籍を読む」ために必要な数学やりなおしの書籍

「AIを使って我が社のビジネスを・・・」
がたいへん流行っているようです。

そんな中、技術の1つの分野として機械学習を勉強しておきたい!というプログラマの人もたくさんいるとおもいます。が、しかし、機械学習の良書や優れたWeb記事を読むためには、数式が理解できなければページをめくることができません。

数式なしでも分かる機械学、、、方面にいってしまうのも1つの手としてありますが、やはり肝心なところが理解できず、表面をかすっただけになってしまうのも残念です。

では、数学苦手な人は挫折するしかないのか、、、、というのも悲しい話で
特に「ビジネスドメインに関する高度な知識がある」という方は非常にもったいないので、数式を見ると頭痛がする人は頭痛薬を飲んで、人類の輝かしい未来のためにぜひ復習していただけるいいなと思っています。


機械学習を理解するために必要な数学は大きく分けて

があると思いますが、理系大学の学部(教養課程)で習うレベルまで理解できていれば、少なくとも「機械学習の書籍を読み進める」ことはできます。

そこで、「理系だけど昔過ぎて忘れてしまった」「そもそも文系なので大学で数学を履修していない」という方向けに読みやすく復習に向いている(と私が思う)数学の本をいくつか紹介します。

ふたたびの微分積分

そもそも微分とはなんぞや、積分とはなんぞや、からの解説が豊富にあります。具体的な例をつかって、変化率とは?傾きとは?数列とは?面積をともめる!みたいな、人間にとって想像しやすい切り口で解説されています。


www.amazon.co.jp


やさしく学べる線形代数

機械学習に限らず、線形代数が理解できていれば人生得することが多いので、ぜひとも線形代数だけは、、、という感じでもあります。中学のときに習う連立方程式みたいなのから始まり、丁寧な解説付きの練習問題を解くことができるので読みやすいかと思います。

www.amazon.co.jp


完全独習 統計学入門

度数分布・平均・標準偏差のあたりからものすごく丁寧に説明されています。中学程度の知識で読み進められます。独習方式なので詰むことも少ないのではないかと思います。

www.amazon.co.jp



ニューラルネットワーク自作入門

ニューラルネットワークで使われる数学をこれでもかといわんばかりに丁寧に説明した入門書です。行列計算なども具体的な数値を入れて、例を出して解説しています。前提知識は、高校程度の数学だとおもいます。
www.amazon.co.jp


これを読んで「理解できた!実装もできた!」という方は、技術評論社の「ITエンジニアのための機械学習理論入門」がおすすめです。


ここからは、ドメイン知識を前提にした数学の本の紹介です。ご紹介できるのが偏ってますが。。。

金融・証券のためのブラック・ショールズ微分方程式

証券の勉強するため良いよと銀行マンの友達におすすめしてもらった本です。

文系=数学苦手、、、というのは都市伝説だろ!!!!としか思えないほど、金融クラスタは数字に強い人が多いです。それは、彼ら彼女らが就職後に、大学で履修していなかったにもかかわらず、数学をこつこつ勉強した結果なのであって、素晴らしいなと!


ブラックショールズの微分方程式の導出と解き方を丁寧に解説されていて、分かりやすいうえに、面白いです(笑)ぜひ読んでみてください!

www.amazon.co.jp

証券アナリストのための数学再入門

証券の知識があまりなくても、読み進められます。資格試験の本らしく練習問題ありなので理解度チェックもできます!

www.amazon.co.jp




なお私自身が漫画や小説のような「文書が構造化されていない読み物」がほとんど理解できないため、、、、対話で分かる○○、とかイラストで学ぶ▲▲のような本はおすすめ対象外にしています。しかし数学が苦手な人の中には、もしかしたら小説のようなストーリ性のある本のほうが理解が進むという人もいるかもしれません。大きな本屋さんにいくと、たくさんの数学本が売られていますので、自分にあったものを1冊選んで読んでみると良いかなーと思います。

これからのプログラマには、プログラミング力に加えて、深いドメインナレッジやサイエンスの知識が求められるため「なんて生きづらい世界なんだ!!!」だとは思いますが、やってみるとわりと楽しいので、あまり苦手意識や先入観を持たずに、紙と鉛筆で解いてみると良いかもしれません。




10/22(日)に開催される技術書典3という同人誌のためのイベントに「技術者のためのやさしい数学 vol.2」という本を頒布します。本格的にガロア理論が勉強できます。数学好きな方ぜひぜひ会場で~♥

techbookfest.org


こちらは前回の技術書典2で頒布させていただいたものです。
www.dlmarket.jp

オイラーの公式は素敵ですねという話

数値流体力学で私が好きなものの1つに複素速度ポテンシャルがありますが、流体に限らず力学の世界では「オイラーの公式」をあたりまえのように使います。

このオイラーの公式は、ものすごくシンプルなのですが大変ロマンチックなので「美しい数式」としても有名です。

$$
e^{i x}=\cos x+i\sin x
$$



前提知識

オイラーの公式の素敵さを知るために必要な前提知識は、以下の通りです。

オイラーeとは

オイラー数とは、自然対数の底eのことです。その値は


e = 2.71828 18284 59045 23536 02874 71352 …
と続く超越数です。たくさんの偉い人が、オイラー数について詳しい説明をされているので、ググってそちらを読んでください。

虚数iとは

虚数とは、実数ではない複素数のことです。
たくさんの偉い人が、虚数*1について詳しい説明をされているので、ググってそちらを読んでください。

正弦余弦\sin x / \cos xとは

中学校の数学でおなじみの\sin x/\cos xです。たくさんの偉い人が、、、


これ以外にも、微分とは?も知っておく必要があります。
しかし、高校までの数学ですべて習っている範囲だとおもいます。

オイラーの公式を導出しよう!

オイラーの公式はいくつかの方法で導出できるようですが、ここは解析学で!

f\left( x\right)x=0を含む区間微分可能で、かつn\rightarrow \inftyのとき次の式が成り立ちます。


f\left( x\right) \fallingdotseq  f\left( 0\right) +f'\left( 0\right) x +\dfrac {f''\left( 0\right) } {2!}x^{2}+\dfrac {f'''\left( 0\right) } {3!}x^{3}\ldots+\dfrac {f^{n}\left( x\right) } {n!}x^{n}  \tag{1}

これはテイラー展開とよばれるもので、一般の関数 f(x)多項式で近似する方法です。流行りの機械学習でもよく登場します。



まず、オイラーの公式の左辺を考えます。

f\left( x\right) =e^{i x}を式(1)に代入すると


\begin{eqnarray}
e^{ix} &=& 1 + \frac{ix}{1!} + \frac{(ix)^2}{2!} + \frac{(ix)^3}{3!} + \frac{(ix)^4}{4!} + ... \tag{2}
\end{eqnarray}

がなりたちます。

ここで、 i^2 = -1なので、式(2)は

\begin{eqnarray}
e^{ix} &=& 1 + i\frac{x}{1!} - \frac{x^2}{2!} -i \frac{x^3}{3!} + \frac{x^4}{4!} + ... \tag{3}
\end{eqnarray}
となります。



次に、右辺を考えます。

f\left( x\right) =\cos xを式(1)に代入すると


\begin{eqnarray}
\cos x &=& 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \frac{x^8}{8!} ... \tag{4}
\end{eqnarray}

f\left( x\right) =\sin xを式(1)に代入すると


\begin{eqnarray}
\sin x &=& x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \frac{x^9}{9!} ... \tag{5}
\end{eqnarray}
がなりたちます。



ここで、式(4)と式(5)をふまえて、式(3)をしっかり見つめます。

そして、整理します。

すると、、、、なんとなんと


\begin{eqnarray}

e^{i x} &=& 1 + i\frac{x}{1!} - \frac{x^2}{2!} -i \frac{x^3}{3!} + \frac{x^4}{4!} + ... \\\
&=& (1 - \frac{x^2}{2!} + \frac{x^4}{4!} - ...) + i(x - \frac{x^3}{3!} + \frac{x^5}{5!} - ...)  \\\

e^{i x} &=& \cos x+i\sin x
\end{eqnarray}


実数の世界では全く他人の指数関数と三角関数が、、、、、

実は虚数の世界を通じてつながっていたというロマンチックさ♡

f:id:dr_asa:20170908161854j:plain

*1:大事なのは、妄想癖

物理空間から計算空間への座標変換

日々生活していると、2次元での物理空間から計算空間への座標変換をしたくなるときがあります。

なので、備忘録として。


物理空間 (x,y,t)デカルト座標系の計算空間 (\xi, \eta ,\tau)写像する場合
計算空間での格子間隔を \Delta \xi = \Delta \eta =1 とすると、 f(x,y,t) \tauに関する微分は次の式になります。

 
\dfrac {\partial f} {\partial \tau } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \tau } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \tau } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \tau }

同様にして、 \eta
 
\dfrac {\partial f} {\partial \eta } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \eta } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \eta } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \eta }


同様にして、 \xi
 
\dfrac {\partial f} {\partial \xi } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \xi } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \xi } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \xi }


行列で表すと、こう。


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right] = 

  \left[
    \begin{array}{rrr}
      1 & x_{\tau} & y_{\tau} \\
      0 & x_{\eta} & y_{\eta} \\
      0 & x_{\xi} & y_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right]



逆の変換式は (x,y,t) (\eta,xi,\tau)を入れ替えるとよいので、次の式です。


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right] =

  \left[
    \begin{array}{rrr}
      1 & x_{\tau} & y_{\tau} \\
      0 & x_{\eta} & y_{\eta} \\
      0 & x_{\xi} & y_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right]

ここで、、、

座標 (x,y)と座標 (\eta,\xi)ヤコビアン Jとすると


J = x_{\eta}y_{\xi}-x_{\xi}y_{\eta}

で、


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right] =

 \dfrac {1} {J }
  \left[
    \begin{array}{rrr}
      J & (-x_{\tau}y_{eta}+y_{\tau}x_{\eta}) & (x_{\tau}y_{\xi}-y_{\tau}x_{\xi}) \\
      0 & y_{\eta} & -y_{\xi} \\
      0 & -x_{\eta} & x_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right]

です。


境界が変化しない場合を考えると、


f_x = \dfrac{1}{J}(y_{\xi}f_{\eta}-y_{\eta}f_{\xi}) \\
f_y = \dfrac{1}{J}(-x_{\xi}f_{\eta}-x_{\eta}f_{\xi}) \\

です。

クランクニコルソン法とフォンノイマンの安定性

計算の待ち時間の備忘録として。


空間における2階の微分を陽解法による差分と陰解法による差分の算術平均で表したものが、クランクニコルソン法です。



\dfrac {\partial u} {\partial t}=\alpha \dfrac {\partial ^{2}u} {\partial x^{2}}


これを陽解法と陰解法の差分の算術平均を表します。


\dfrac {u_{i}^{n+1} - u_{i}^{n}}{\Delta t} =\dfrac{\alpha}{2} \left( \dfrac {u_{i-1}^{n+1} -2u_{i}^{n+1}+u_{i+1}^{n+1}} {\left( \Delta x\right)  ^{2}} + \dfrac {u_{i-1}^{n} -2u_{i}^{n}+u_{i+1}^{n}} {\left( \Delta x\right)  ^{2}} \right)


クランクニコルソン法の陽解法と陰解法の算術平均を重み \thetaによる平均の例だとすると次の一般化が可能。


\dfrac {u_{i}^{n+1} - u_{i}^{n}}{\Delta t} =\alpha  \left( \dfrac {u_{i-1}^{n+1} -2u_{i}^{n+1}+u_{i+1}^{n+1}} {\left( \Delta x\right)  ^{2}} +( 1-\theta ) \dfrac {u_{i-1}^{n} -2u_{i}^{n}+u_{i+1}^{n}} {\left( \Delta x\right)  ^{2}} \right)

ここで \theta=0のとき陽解法、 \theta=1のとき陰解法、 \theta=\dfrac{1}{2}のときクランクニコルソン法になります。



で、フォンノイマンの安定性解析は、差分スキームの安定性を判断するために使われますが、、、、
近似解 u_{N}、厳密解 u_{E}、誤差 \epsilonとすると



u_{N} = u_{E} +  \epsilon

が成り立ちます。
で、次の1次元熱伝導方程式の陽解法の近似式の安定性をみてみます。

 
\dfrac{u_{j}^{n+1} - u_{j}^{n}}{\Delta t}= \alpha \dfrac{u_{j-1}^{n}-2u_{j}^{n} + u_{j+1}^{n}}{(\Delta x)^2}


ここで誤差 \epsilonについては、次の式が成り立ちます。

\dfrac{\epsilon_{j}^{n+1}-\epsilon_{j}^{n}}{\Delta t} = \alpha \dfrac{\epsilon _{j-1}^{n}-2\epsilon _{j}{n} + \epsilon _{j+1}^{n} }{(\Delta x)^2}

誤差 \epsilonは離散化された複素フーリエ級数をつかって次のように表すことができます。


\begin{eqnarray}
\epsilon _{j}^{n} = \sum _{m=-\infty }^{\infty } C_{m}^{n}e^{i\beta _{m} j \Delta x}, x=j\Delta x , t= n \Delta t , \beta_{m}=\dfrac{m \pi}{l}
\end{eqnarray}

誤差 \epsilonが時間ともに増幅しないためには、ある時刻における誤差が次の時間ステップで大きくならなければよいので、、、



G = \dfrac{\epsilon _{j}^{n+1}}{\epsilon _{j}^{n}} = \dfrac{C_{m}^{n+1}}{C_{m}^{n}}
としたとき、 \left| G\right| \leq 1なら安定、そうでなければ不安定です。


誤差の近似式を整理すると次の式になります。

C_{m}^{n+1} = \left\{  2\dfrac{\alpha \Delta t}{(\Delta x)^2} \left( \dfrac{e^{i \beta _{m}\Delta x} + e^{-i\beta _{m}\delta x}}{2} -1  \right)  \right\} C_{m}^{n}


ここで、

s = \dfrac{\alpha \Delta t}{(\Delta x)^2}

として、次のオイラーの公式と、、、、、

\dfrac{e^{i\beta _{m}\Delta x} + e ^{-i\beta _{m}\Delta x}}{2} = \cos (\beta _{m}\Delta x)

半角公式を利用すると、、、、、、

\dfrac{1-\cos(\beta _{m}\Delta x)}{2} =  \sin^2 \left( \dfrac{\beta_{m}\Delta x}{2} \right)


次の式が得られます。


G = -4 s \sin ^2 \left(  \dfrac{\beta _{m}\Delta x}{2}  \right) +1


安定のためには、次が成り立てばよさげ。


`-1 \leq -4 s \sin ^2 \left(  \dfrac{\beta _{m}\Delta x}{2}  \right) +1 \leq 1

機械学習を勉強するときはDockerを使うと便利

いまお仕事の関係で、機械学習の教科書的な書籍を読んだりオンライン講座を受講したりしながらサンプルやチュートリアルを動かして勉強しています。

機械学習を勉強するときは、Pythonの環境を構築し、JupyterNotebookを使って、実際に手と頭を動かしながら行うのが効率的です。が、アルゴリズムの理論そのものの理解がすでにしんどい上、過学習対策のための正則化、汎化性能の評価、クロスバリデーション、不均衡データや少ないデータはどうすればいいか、などなどいちいち難しいことを数多く勉強しなければなりません。

その上、、、、機械学習での学習は、1度やれば終わり!ではなく、パラメータチューニングしたり、データを増やしたり加工したりしながら、繰り返しなんども行う必要があります。一見ビジネス寄り&アカデミックな雰囲気を醸し出していますが、実際のところは、非常に泥臭い作業のオンパレードです。

が、、、、、

環境構築が、めんどくさい。

ライブラリのバージョンの違いで実装が・・・というのものも多々あります。

アルゴリズムや実装の確認などは手元のPCでゆっくり考えてデバッグしながらやるとして、、、 いざ、実際に大量の画像データなどを使ってモデルを生成しよう!となると、 クラウドの強いインスタンスを使うのが便利なので、手元のPCの環境が、そっくりそのままクラウド上で動いてくれると、わりと幸せです。

ということで、機械学習を勉強するためDockerを使っているので、簡単にご紹介です。

1. Dockerとは

Dockerはアプリの実行環境をまとめて「コンテナ」として管理できるツールです。Dockerをつかうとこんなことができます。

f:id:dr_asa:20170821105634p:plain

OSやバージョンも指定できますので、Docker上で作成した環境と同じものを、(基本的には)どこででも実行できます。

Dockerでは、「Dockerイメージ」と呼ばれるものに、実行環境に必要なディレクトリ/ファイルをDockerイメージにまとめます。このまとめたDockerイメージを「リポジトリ」を介してアップロード(push)/ダウンロード(pull)して環境を移植します。

Dockerの公式リポジトリは「DockerHub」と呼ばれ、アカウント登録さえすれば、無償でも利用可能です。

https://hub.docker.com/

2. Dockerのインストール

Dockerを使って環境を構築するには、使っているPCや学習させるためのマシンに、それぞれDockerをインストールします。

2.1 MacOSへのインストール

MacOS向けには「Docker for Mac」が提供されています。 以下の公式サイトからモジュールをダウンロードして、指示に従ってインストールします。

Docker For Mac | Docker

2.2 WindowsPCへのインストール

WindowsPC向けには、「Docker for Windows」が提供されています。このDoker for Windowsは以下の条件を満たすマシンが必要です。

Docker For Windows | Docker

なお、Hyper-Vは、Windows標準の仮想化環境です。こちらに環境の確認方法をまとめました。

いや、Windows7だし。という方は、「Docker Toolbox」というツールが提供されていますので、そちらを使って下さい。

Docker Toolbox | Docker

が、Windows7マイクロソフトが2009年に出したOSです。2009年に生まれた赤ちゃんは、もう小学校2年生です。この夏休みに、Scratchを使って自作ゲームを作っている子もいるかもしれません。IT業界に身を多く大人のみなさんは、Azure/GCP/AWSインスタンスを使うか、Windows10 Proに買い替えるのがおすすめです。

2.3 Linuxへのインストール

ディストリビューションによって、Dockerのインストール手順が違いますので、公式サイトのとおり導入してください。

Docker for CentOS Distribution | Docker

Docker for Debian | Docker

Docker For Ubuntu | Docker

あと、クラウドで利用するときはこちらです。

Docker for AWS | Docker

  • Azure

Docker for Azure | Docker

3.機械学習用Dockerコンテナの起動/停止

Dockerでは、DockerイメージをもとにしてDockerコンテナを起動します。

機械学習でよく使うライブラリ群をインストールしたDockerイメージを作成したので、まずはこれをお試しで起動してみます。

ライブラリ 説明
Python 3.6 Python3.6実行環境
TensorFlow 機械学習ライブラリ
scikit-learn 機械学習ライブラリ
keras TensorFlowやTheanoで実行できるニューラルネットワークライブラリ
jupyter 対話型Python実行環境
scipy 科学計算用ライブラリ
simpy 離散シミュレーションライブラリ
matplotlib グラフ描画ライブラリ
numpy 数値計算ライブラリ(ベクトル/行列計算など)
pandas データ解析ライブラリ
plotly オシャレなグラフ描画ライブラリ
sympy 符号数学ライブラリ
mecab-python3 形態素解析エンジン
librosa 音声信号処理ライブラリ
Pillow 画像処理ライブラリ
h5py HDF5 フォーマットファイル
google-api-python-client GCPを使うためのAPI

このDockerイメージ「asashiho/ml-jupyter-python3」は、DockerHubで公開していますのでそれをもとに、次のコマンドで「ml-container」という名前のDockerコンテナを起動します。 コマンドのpオプションは、コンテナで転送するポート番号を指定してます。 ここでは、JupyterNotebookが8888番ポートを使っています。

$ docker run -p 8888:8888 --name ml-container -it asashiho/ml-jupyter-python3

コンテナは、[Ctrl]+[C]で停止できます。

また、バックグラウンドで動いている場合は、次のコマンドでコンテナを起動/停止できます。

$ docker container start ml-container
$ docker container stop ml-container

コンテナは、次のコマンドで削除できます。

$ docker container rm ml-container

なお、コンテナを削除するとデータも消えますので、データを消したくないときは docker runコマンドでコンテナを起動するときに、Dockerのホストマシン(お使いのPCやクラウドインスタンス)をディレクトリをvオプションでマウントしてください。

4. JupyterNotebookを使う

Dockerコンテナが起動できたら、ブラウザから以下のアドレスにアクセスしてJupyterNotebookを使います。 アクセス先のURLは、docker runコマンドを実行したときのコンソールに表示されます。

クラウドインスタンスの場合は、以下のアドレスでアクセスできます。

http://DockerホストのIPアドレス:8888/?token=<your token>

MacOSまたはWindowsPCのローカル環境の場合は、以下のアドレスでアクセスできます。

http://localhost:8888/?token=<your token>

こんな感じです。

f:id:dr_asa:20170821132838p:plain

5. 環境をカスタマイズしたくなったときは

Dockerイメージは「Dockerfile」という定義ベースのファイルで実行環境の構成を管理しています。

このファイルをカスタマイズし、Dockerfileをビルドすることで、任意のDockerイメージを作成できます。たとえば、Pythonのバージョンを変えたい、TensorFlowを最新にしたい、足りないライブラリがあった、など。

今回お試しで使ったDockerイメージのもとになるDockerfileを公開してますので、ご参考までに。

github.com

Dockerfileのビルドは、docker buildコマンドを使いますが、DockerHubとGitHubを連携させると「Automated Build」という機能が使えます。

これは、GitHubへのpushをトリガーにして、DockerHubでDockerイメージを自動でビルドできる機能です。

f:id:dr_asa:20170821112347p:plain

ビルドに時間はかかりますが、なかなか便利です。

無理のない、よい機械学習ライフを。

© 2017 ASA.