読者です 読者をやめる 読者になる 読者になる

あさのひとりごと

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

「プログラマのためのGoogle Cloud Platform入門」が発売されます。

翔泳社より、表題の書籍が出版されることになりました。
監修であり共著者の中井さんを始めとして、執筆にご協力いただいた方々に改めてお礼を申し上げます。

本書では、Google Compute Engine、Google Container Engine、Google App Engineを中心としたGCPの主要サービスを用いて、最適なアプリケーションアーキテクチャーを実現する方法を具体的なサンプルアプリケーションを使って説明しています。

特に、GCPを利用する上で理解しておきたいインフラの基礎技術についても解説が加えられていますので、GCPを通してインフラ技術の基礎を習得したいという方におすすめな入門書となっています。

f:id:dr_asa:20170423230137j:plain]

Amazon CAPTCHA


技術の進化はとても早く、流行とともに忘れ去られるものもたくさんあります。
しかし、時が経っても大きく変わらないものもあります。

本書にまとめた、インフラ技術の基礎は
私が、新卒のころに担当していたオンプレミスの大規模基盤構築プロジェクトで
先輩エンジニアの皆さんから教えていただいたことをベースに書いています。

非常に厳しいプロジェクトでしたが、とりわけ出来の悪かった私に
基礎をていねいに体系立てて指導してくださった先輩方のおかげで、今の私があると思っています。



私は、出産と子育てで約8年間もの長い間、IT業界からは離れていましたが、
2016年の中頃、子育てがひと段落したので、ふたたびSIに携わりたいと思い、現職につきました。

私が育児で現場を離れている間、クラウドや仮想化、大規模分散システムなど
インフラストラクチャを構成する技術要素は大きく変わりました。

そんな中、オンプレミスで止まってしまっている私の知識と経験を十分知ったうえで
「一緒に本を書こう!」と声をかけてくださった、中井さんへの感謝は、、、、言葉にはできないものがあります。

いかに本質的なものを学ぶことが大事か、を
中井さんの圧倒的に高い技術力をベースにして、たくさん教えていただきました。




クビを覚悟のうえで。

私は、ものづくりが好きです。

刻々と変化する時代に合わせ、顧客のビジネスニーズに応じて、顧客と一緒にシステムを作る、というのは
非常にエキサイティングな仕事です。
それが大規模な社会基盤であったり、ミッションクリティカルであるほど、やりがいも大きくなるものです。
再就職にあたり、プライムベンダーに身を置いたのは、顧客に近い位置でものづくりに携わりたかったからです。

しかし、今日のSIの現状は、エンジニアが楽しんで、より良いものをつくろう!という
モチベーションで仕事ができない環境が多いのではないかと感じています。

そのような現状を打破し
新しい技術や開発手法にチャレンジして、イノベーションを起こすには
エンジニア自らがさまざまなことを学び続け、環境を変える以外に選択肢はないのかなと思っています。

しかし、ただやみくもに技術トレンドを追うだけではいけません。
型破りな人間になるためには、破るべき型がなになのかを知らなければなりません。

本書は、そんな若いエンジニアの皆さんのはじめの一歩を踏み出す手助けになればいいな!と思って書きました。
そして、またいつかエンジニアになりたいな、と思っている私自身にむけても。

おわり



www.youtube.com

Share My World (Mary J. Blige) 1997.04.22

Share my world
Don't you leave
Promise I'll be here
Whenever you need me near

TensorFlowでAIとピアノ連弾してみた話

音楽は良いですね。
音楽は、お酒との相性が抜群です。

というわけで、、、、
TensorFlow/Magentaを使った
A.I.Duet」でコンピュータとピアノ連弾する方法をご紹介します。

おことわり
人工知能が音楽を生成するというと、
何かしらの知性や才能のようなものが宿って
そこから生んでいるという感じですが、

人工知能にとって、音楽は「音のデータの連なり」です。
そして、「音楽を生成する」ということは
「それまでの音のデータの連なりからして、適切な次の音を予測する」ということです。
from 同僚の@icoxfog417 先生の詩集より

TensorFlow/Magentaとは

機械学習とは、データが持つ数学的な構造をコンピュータによる計算で見つけ出すしくみのことです。
機械学習の中でも、特に注目を集めているのが、ディープラーニング(深層学習)と呼ばれているものです。

アートの世界での機械学習の応用も、多くはこのディープラーニングの技術を使っています。

TensorFlowは、米Google社がオープンソースとして公開してるディープラーニング対応ライブラリです。
TensorFlow/Magentaは、ディープラーニングを研究するGoogle人工知能部門である「Google Brain」による
ニューラルネットワークを使って、アートを生成するプロジェクトです。
f:id:dr_asa:20170314124427p:plain


オープンソースソフトウェアで、Githubで開発が進められています。
Magenta

A.I.Duetとは

パソコンのキーボード(または対応するMIDIキーボード)でメロディーを奏でると
コンピューターがデュエット演奏してくれるWebアプリです。

TensorflowのMagentaをつかい、事前にプログラムされたアルゴリズムではなく、
既存のメロディーを使った訓練を受け、そこで得た知識を使ってレスポンスを返します。

これを動かすDockerイメージをビルドしたので、遊んでみる手順を簡単に紹介します。

1.Dockerの実行環境構築

ここでは、Google Cloud Platformの仮想マシンでDockerを動かす手順を説明します。

まず、こちらの手順にしたがって、アカウント登録をしてください。
book.mynavi.jp


Cloud Shellとは、GCPのサービスをブラウザから操作できるツールです。
Cloud Consoleの右上のコンソールアイコンをクリックしてください。

f:id:dr_asa:20170314130309j:plain:w400


Cloud Shellで、次のコマンドを実行します。GCPの東京リージョンに、「n1-standard-1」サイズの仮想インスタンスが立ち上がります。

$ GCP_PROJECT_ID=$(gcloud config list project --format "value(core.project)")

$ docker-machine create --driver google \
  --google-project $GCP_PROJECT_ID \
  --google-zone asia-northeast1-a \
  --google-machine-type n1-standard-1 \
  --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20161109 \
  magenta


これで、Dockerの実行環境が構築できました。

なお、作成した仮想マシンSSHするときは、Cloud Consoleで[SSH]ボタンをクリックします。

f:id:dr_asa:20170314130710p:plain:w400


※なお、Dockerがうごく環境であれば、クライアントPCでもAWSでもAzureでも大丈夫です。
※Dockerって何?、、、そんなあなたは、「プログラマのためのDocker教科書」を図書館で借りてください!


2.「A.I.Duet」のコンテナを動かそう

Dockerが起動している環境にSSHで接続して、次のコマンドを実行します。

$ sudo docker run -it -p 80:8080 --rm --name magenta asashiho/ai-duet

3.「A.I.Duet」でピアノを弾こう

クライアントのブラウザから以下のURLにアクセスします。

http://<Dockerの動いているマシンのIPアドレス>/

こんな感じです。
www.youtube.com


おわりに

Googleらしい、とても面白い取り組みで、TensorFlow/Magentaすごく注目しています。



このMagentaを使ってMIDIデータから音楽を生成するしくみやノウハウなどをまとめた
Signalというタイトルの同人誌を出します。
NN/RNN/LSTMなどの理論や、実際にMagentaを使って音楽を生成する手順などを約40ページでまとめています。
理論は、同僚で共著の@icoxfog417 先生がしっかり書いて、それを私が読んで理解して動かすという感じです。
(想定読者が私になっているので、かなり易しく書かれています)
(私が書いた部分も、彼がきちんと監修してくれているので、ぜんぜん大丈夫です!)

f:id:dr_asa:20170313022558j:plain:w400


4/9(日)に秋葉原で開催される「技術書典2」で頒布しますので、ブース「き-03」にぜひ~!
techbookfest.org

詳しくは、まだ秘密ですが、、、、、
こんな感じです!
www.youtube.com


会場では「littleBits」という簡単な電子工作キットを使って演奏を楽しめます~~~
jp.littlebits.com



おわり

機械学習素人が2か月半で機械学習を入門したことまとめ

ちまたでは、機械学習がブームのようです。
が、、まったく時代についていけていません。

しかし、機械学習、特に自然言語処理に精通した人の採用にかかわる仕事をしている、、、
にもかかわらず、自然言語処理どころか機械学習が全く分からない。

これでは、いけない。ということで
機械学習をたしなむ学生の皆さんと、ふわっと雑談ができるレベル」
を目指して、2017年正月明けから勉強を始めました。

ちなみに、どんなにキリが悪くても1日3時間まで!と決めています。

  1. そもそも機械学習に興味関心があるわけではない
  2. やらなければならない他の仕事がある
  3. 家事育児が優先

なので、すこしでも無理すると続かないためです。

「AIで世界を変えられる!」
人工知能で想像もできない未来が、、、」

みたいなご時世の中、ありえないほどの低テンションで淡々と勉強しているわけで
逆に、そういう意識低い系人間はそんなに多くないでしょうから
なにをやったか、そのログをまとめました。

インプット


■オンライン講座

次の動画を見ました。動画は耳からも情報が入るので、新しく始める分野の勉強にはいいかもしれません。

「みんなのAI講座 ゼロからPythonで学ぶ人工知能機械学習

機械学習に入る前に、PyCharmのインストール
数学の基礎やPythonの基礎などもあるので
ほんとうに初めて触る人にはお勧めできます。

NNの基礎や誤差逆伝播法なども解説があります。
私は、ほぼ知っている内容だったので、途中は端折っています。
www.udemy.com

「Coursera Machine-Learning」

機械学習でとても有名なオンライン講座です。
Octaveという言語を使い、機械学習の理論と実装を学べる講座です。
他の人が、素晴らしいブログを書かれているので、内容はそちらで。

数学の基礎知識が
ほぼ無くても受けられるので、数学嫌いな人にはおすすめです。


まだ途中なのですが、地味に進めたいと思います。
www.coursera.org


「アプリケーション開発者のための機械学習実践講座」

機械学習をビジネスでどう活用するか、という一歩進んだ内容の講座です。
私は、まだビジネスで、、、というレベルまで達してないので
もう少し修業を積んでから受けたいと思います。

私の同僚の@icoxfog417 先生が講師です。
www.udemy.com


■読書

続いて、読んで手を動かした本です。

Pythonによる機械学習入門」

私は、そもそもPythonが苦手なので、まずは苦手意識を克服しようと
Pythonの実装の練習が出来るかなと思って買いました。

機械学習をベースにPythonで実装してみる、という本なので
入門にはおすすめです。半日もかからないです。
shop.ohmsha.co.jp

「ITエンジニアのための機械学習理論入門」

機械学習の理論を数学的な観点から、丁寧に解説されています。
ベストセラーなのは納得です。とても良いです!!

私は機械学習分からない&興味薄めなのですが、
数学は嫌いではないので、そういう方におすすめです。
Amazon CAPTCHAgihyo.jp

「ゼロから作るDeepLearning」

ディープラーニングの入門書です。Pythonでゼロからディープラーニングを作りながら仕組みを勉強できます。
ディープラーニングの基礎や、誤差逆伝播法やCNNなどあります。
数学のかなり易しいレベルまで解説があるので、苦手な人や忘れてしまっている人にはお勧めです。
上記のCourseraの講座もそうですが、偏微分とは?みたいなものもあります。
www.oreilly.co.jp

「TensorFlowで学ぶディープラーニング入門」

こちらのブログで!
dr-asa.hatenablog.com

■講座

「ITエンジニアのための機械学習理論入門」

講師の中井さんとお仕事をさせていただく機会があり、
講座内でDockerを使っていることもあって、サポートとして参加させていただきました。

Codezine Academy


非常に、分かりやすい!!!講座です。
機械学習の理論の丁寧な丁寧な説明があります。
受講するには、大学1年生レベルの数学の知識と、Pythonのコードが読める必要があります。

が、理系大学を卒業して、なにかしらのプログラミング言語が読み書きできる方であれば
どなたでも大丈夫だと思います。
(逆にそうでない方は、しっかりと予習が必要です)

次回は6/29(木)で、4月中旬から募集開始予定なので
効率よく機械学習の理論を勉強したい方は、ぜひー。

またDockerや環境構築などのサポートをさせていただく予定なのでよろしくお願いします。

アウトプット



というのをふまえて、この2か月半での成果です。

■TensorFlow/Magentaの同人誌を書く

TensorFlow/Magentaは、ディープラーニングでアートを生成するプロジェクトです。

このMagentaを使って音楽を生成するしくみやノウハウなどをまとめた
Signalというタイトルの同人誌を出します。
NN/RNN/LSTMなどの理論や、実際にMagentaを使って音楽を生成する手順などを約40ページでまとめています。
理論は、共著の@icoxfog417 先生がしっかり書いて、それを私が読んで理解して動かすという感じです。
(想定読者が私になっているので、かなり易しく書かれています)

ご安心ください!私が書いた部分も、彼がきちんと監修してくれているので
ぜんぜん大丈夫なクオリティです!

f:id:dr_asa:20170313022558j:plain


4/9(日)に秋葉原で開催される「技術書典2」で頒布しますので、ぜひブース「き-03」に!
techbookfest.org

こんなことができます!
www.youtube.com



マイナビ書籍「機械学習で遊ぼう」の記事連載

これは、機械学習とは何ぞや、、というがっちりした連載ではなく
機械学習をつかったアプリを作ってみよう!というカジュアルな連載なのですが、
初回の記事を寄稿させていただきました。
来月はAndroidアプリ、その次はTensorFlowを使ったなにかを予定しています。

book.mynavi.jp

私以外の他の執筆者が、データサイエンス界隈の錚々たるメンバーなので、
記事の内容うんぬんではなく
「たった2か月たらずの勉強で連載を始めてしまうという、メンタルの強さ
が鍛えられたという、とても大きな成果があったと考えています。



機械学習で遊んでみた

勉強だけだと飽きるので、サンプルを動かしてみたり
改造して機能追加してみた程度のものをいくつか作ってみました。

TensorFlow/Magentaでアート生成

同人誌では、TensorFlow/Magentaを使って音楽を生成していますが
Magentaはアートも生成できます。
というわけで、私のアイコンを生成してみました。
f:id:dr_asa:20170313191934j:plain
TensorFlow/Magenta Sample

RaspberryPi3+TensorFlowを使った物体認識

Raspberry Pi3でTensorFlow/Kerasを使った物体認識を試してみました。
学習済みモデルInceptionV3をRaspberryPiで動かしています。
カメラモジュールの精度が悪く、写真そのものが綺麗に取れないんですが、なんとか認識です。

f:id:dr_asa:20170313022159j:plain:w350

AndroidとTensorFlowでMNIST

こちらは、Android上でMNISTの手書き文字認識を行った例です。
f:id:dr_asa:20170313022218j:plain:w200

AndroidGoogle Vision APIOCR

Google Cloud Platformの画像認識APIであるVision APIをつかったOCRの例です。
f:id:dr_asa:20170127150944p:plain:w200

Azure Cognitive ServicesのFaceAPIでWPFアプリ

こちらは、AzureのCognitive Servicesの画像認識APIであるFaceAPIをつかった顔認識の例です。
ドキュメントも豊富でとても使いやすい感じです。
f:id:dr_asa:20170313191840j:plain

これから



買ったもののまだ読みきれてない本、終わってない講座があるので、
まずはそれをサボらず進めたいと思います。

で、仕事でやっているので
インプットしたものを、少しでもアウトプットしなければいけないわけですが
う~~~~~~~~~~~~ん、難しい。
すでに、データサイエンティストの方がすごい情報を発信しているわけなので。


私は、たまたま数学がそんなに嫌いではなかったのと、良い先生たちが身近にいたので

機械学習に入門しよう!という心理的&技術的ハードルはそれほど高くなかったわけですが
数学が嫌いな人や、なにから手を付けようという人は、とてもしんどいんじゃないかな~と。


なので、彼らから教えてもらったことをきちんと咀嚼して、
機械学習を始めるうえで、ぜったいにはずせない重要かつ基礎的なところである

機械学習はじめたい人のための大学1年生の数学超入門」みたいな連載を
ゆっくりペースで始めたいな~とおもっています。


応援メッセージが届くなど



情報発信は、だるいわけです。

が、ここ最近AWSの本を読んでくださったエンタープライズな方からファンレターをいただくことが増え、とてもありがたいなと思っています。


あと、Twitterでまほうのことば「ナビエストークス」と呟くと、その筋の人から
「Dockerの本読みました!」
とDMが届いたりして、めちゃくちゃ嬉しい。
これは、本当にテンションが上がります。


そして、紙でメッセージをいただくこともあります。
そうじもやってるよ!!!
f:id:dr_asa:20170314092549j:plain:w350


というわけで、無理のない範囲で
インプットしたものを、整理しながら情報発信していければなと思っています。

機械(工学の)学習に必要な大学数学をやり直してみた話

ちまたでは、機械学習がブームのようです。
が、、まったく時代についていけていません。

まぁ時代についていく必要はまったくないのですが、、、
いや、なぜここまで食指が働かないのか、自分でもよく分からないです。

機械学習は、数学が大事と言われています。

そこで、機械(工学の)学習に必要な数学をやり直してみてはどうだろう。
という、まさかの左斜め下方向からのアプローチで、すこしタイムスリップしてみました。

※注意: 流行りの機械学習の話は一切出てきません

1.機械工学とは

機械工学(Mechanical Engineering)とは、機械の設計/製作/運用の全てを対象とする工学の分野です。

次の4つの力学(通称:よんりき)を基礎として、あらゆる産業の基幹を支える重工業をはじめ、航空機/鉄道/自動車/船舶/ロボット/ロケット/人工衛星などありとあらゆる分野に応用されている工学分野です。

  1. 機械力学
  2. 熱力学
  3. 流体力学
  4. 材料力学

機械工学が取り扱う学問は、広範囲にわたるので、このうち熱力学と流体力学を取り上げます。

■熱力学とは

熱力学とは、熱や物質の輸送現象やそれに伴う力学的な仕事を解明する学問です。熱力学には次の基本法則があります。

  1. 第0法則(熱平衡)
  2. 第1法則(エネルギー保存則)
  3. 第2法則(エントロピー増大則)
  4. 第3法則(ネルンストの定理)

エネルギーを消費することなく継続的に仕事をする永久機関は存在しない!というエネルギー保存則は、とても有名なので知っている人も多いと思います。第一種永久機関と呼ばれる「外部から何も受け取ることなく、仕事を外部に取り出すことができる機関」があります。
しかし、ある機関が仕事をするためには外部から熱を受け取るか、外部から仕事をなされるかが必要なので、第一種永久機関は何もエネルギー源の無いところからエネルギーを発生させているので、保存則に反している、と言えます。

あと、熱力学ではエントロピーと呼ばれる、運動状態の混沌性や不規則性の程度を表す重要な状態量があります。これは一般では系の乱雑さを表す量と言われていて、自然界では常にエントロピーが小→大に方向に進むというのが、エントロピー増大則です。つまり、閉じた系では、必ず秩序から無秩序へ向かう!というわけです。エントロピーの概念は熱力学を理解するうえで非常に重要で、乱雑さ?とは?となりがちですが、私は、方向性のある現象は、一方向には進むものの、逆方向には戻らないものとざっくり理解していました。熱力学におけるエントロピーは、この不可逆性の度合いを、数値にしたものです。

流体力学とは

流体力学とは、水や空気などの流体(Fluid)が流れる現象を、力学的に解析する学問です。流体に対してさまざまな力が作用することで流れ場がつくられます。流体にかかる力は、圧力/重力/慣性力/せん断応力などがあります。これらの力の収支を取ると状態方程式が導出されます。質量の収支式は連続の式、運動量の収支式はナビエ・ストークスの運動方程式と呼ばれています。

流体には、層流と乱流があり、一般的にはレイノルズ数Reという流体の慣性力と粘性力の比を表す無次元数がありますこの、Reがある一定の数値より大きくなると層流から乱流に遷移します。蛇口から出る水の量が少ないときは、規則正しい流れができますがこれが層流です。水量をだんだん増やすと、あるところで不規則な流れに変わります。これが乱流(Turbulence)です。

乱流は、流速/圧力/温度などの物理量が時間的にだけでなく、空間的にも不規則に変動します。そして、大小さまざまなスケールの渦運動が発生します。渦運動には、流体でありながら剛体と同じように、速度wが渦中心からの半径 rに比例して変化する強制渦領域(Forced vortex)と、速度wが渦中心からの半径rに反比例して変化する自由渦領域(Free vortex)があります。流れ場に渦が多数存在すると、フローパターンはものすごく複雑になります。よって、乱流はいまだ解明できてないことが数多くあります。

だから、おもしろい。というわけでCFDの登場です。


2.数値流体力学(CFD)とは

流体力学や熱力学で導出される偏微分方程式の多くは、厳密解を求めることができない*1といわれています。そこで、境界条件(Boundary Condition)と初期条件(Initial Condition)を決め、支配方程式の近似解を求めるため、コンピュータ上でシミュレーションして、実際の工業の分野に応用させていきます。熱エネルギーの移動も含める場合は、数値熱流体力学!らしいです。

数値流体力学は、流体力学の支配方程式の理解に加えて、方程式をコンピュータで解析できるようにする離散化という処理やプログラミング言語の知識が必要になってきます。
あと、仮定した理論や計算結果の正当性を検証するため、実験を行い結果を評価したりもします。

CFDは、航空や自動車などの空力制御などは華やかシーンでも、重工業やプラントなどでの管内流れ(非定常流や粘性流体)の解析など地味なエネルギー分野でも多く使われています。

3.数値流体力学(CFD)のために必要な基礎知識

網羅的に思い出せないのですが、思いついた順に。

■ 力学

流体力学の基本は、やはり力学です。まず、力学を学ぶうえで、質量/長さ/時間などのSI単位や流速/運動量/エネルギーなどの物理量のちゃんとした理解が必要です。高校までの数学や物理は、教科書に公式があって、それを丸暗記してパターン化すれは、テストでよい点をとることはできます。でも、力学の概念的なところを自分の頭で考えることが難しい&苦手な人は、CFDは大変かもなーと思います。力は目に見えないので、妄想力というかそういうのが、たぶん必要です。

■ 数学

CFDでは、ベクトルや、内積外積、面積分や体積分などの数学の知識が必要になります。そして、なにより偏微分方程式が大事です!!数学的な概念や哲学を理解できればBestですが、工学の世界では、ある事象を数式で表現して、それを解くためのテクニックが必要です。

■ 有限差分法(FDM)/有限要素法(FEM)

有限差分法は、微分方程式を解くため、微分を有限差分近似で置き換えて得られる差分方程式で近似する数値解法で、FDMと呼ばれてます。

有限要素法は、解析的に解くことが難しい微分方程式の近似解を数値的に得る方法の一つです。方程式が定義された領域を要素に分割し、補間関数をつかって近似していきます。ナビエ・ストークスの運動方程式など離散化して行列式に分解するときによく使われます。有限要素法には、メッシュ/節点/要素といった考え方が出てきます。

数値計算

数値計算は、離散化した式を連立方程式を解くことです。ニュートン法ガウスの消去法、最小二乗法、テーラー展開あたりの数学を理解しておく必要があります。あとは、ひたすら膨大な計算をするわけなので、コンピュータにおまかせするためのプログラミング言語も必要です。CFDの場合は、昔はFortranが多く使われてましたが、今はどうなんでしょう。ライブラリや可視化ツールなんかも良いのがあるのかもしれません。どこかで時間を作ってちょっとまじめに調べたいな。

そして、浮動小数点演算をやるので、誤差の概念や、解の収束や発散などの基本的な考え方も必要です。あと、膨大な演算をコンピュータにやらせるので、マシンリソースを有効に使うためのハードウエアやネットワークの知識が必要です。境界条件や初期条件をいい感じで置いてあげないと、解が収束しないので、、、昔はコンピューターリソースが今のように豊富でなかったので、このインフラ的な知識はけっこう大事でした。今は、クラウドがあるのでそういうのは気にしなくていいので、良い時代になったなぁと思います。

というわけで、これらをぼんやりを思い出したところで、簡単な数学の計算ドリルを解いてみますー。

計算ドリル: 熱伝導の基礎方程式



まずは、熱力学の基礎である熱伝導方程式を導出していきます。
熱伝導率を kとし、高さ y、奥行き zのコントロールボリューム内の x軸方向のヒートフローを考えます。

微小時間 \Delta tの間に、 xの位置にあるコントロールボリュームに流入する熱量は

$$
g\left( x\right) \Delta t = -k\dfrac {\partial T} {\partial x}\Delta t
$$

で算出すれば、それより\Delta x離れたコントロールボリューム外に流出する熱量は

$$
g\left( x +\Delta x\right) \Delta t = \left( -k\dfrac {\partial T} {\partial x}+\dfrac {\partial } {\partial x}\left( -k\dfrac {\partial T} {0x}\right) \Delta x + O\left( \Delta x^{2}\right) \right) \Delta t
$$

となります。

単位時間・単位質量あたりS_{h}の発熱があれば、微小時間\Delta tにコントロールボリュームないで内部発熱する熱量は、密度を\rhoとすると

$$
\left( \rho \Delta x\right) S_{k}\Delta t
$$

となります。この内部発熱量はコントロールボリューム内の温度上昇\Delta Tとして蓄積される熱量と流出する熱伝導量と一致するはずなので、比熱をcとして式にすると

$$
\begin{align}
\left( \rho \Delta x\right) S_{k}\Delta t &= \left( p\Delta x\right) c\Delta T +(q\left( x+\Delta x\right) \Delta t -q\left( x\right) \Delta t) \\
&=\left( \rho \Delta x\right) c(\dfrac {\partial T} {\partial t}\Delta t + o\left( \Delta t^{2}\right) )+\left( \dfrac {\partial } {\partial x}(-k\dfrac {\partial T} {\partial x}\right) \Delta x+O\left( \Delta x^{2})\right) \Delta t
\end{align}
$$

となります。

ここで、\Delta t\rightarrow 0\Delta x\rightarrow 0とすると、次の式となります。

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

これは、x方向のみなので、コントロールボリュームを(x,y,z)の3次元として、同様の式を解いていくと、

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right)+\dfrac {\partial } {\partial y}\left( k\dfrac {\partial T} {\partial y}\right) +\dfrac {\partial } {\partial z}\left( k\dfrac {\partial T} {\partial z}\right)+\rho S_{h}
$$

となります。
というわけで、これが3次元空間における熱伝導の式ができたー!

流体は管内を流れることが多いので、デカルト(x,y,z)ではなく円筒座標系(x,r)で同じように式を解いていくと

$$
\rho c\dfrac {\partial T} {\partial t}= \dfrac {1} {\gamma } \dfrac {\partial } {\partial r}\left( rk\dfrac {\partial T} {\partial r}\right)+\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

となります。

数式が長く、ごちゃごちゃしているので、一般形として次のように表します。

$$
\rho c\dfrac {\partial T} {\partial t}=\nabla \cdot \left( k\nabla T\right) +\rho S_{n} \tag{1}
$$

すっきり!

計算ドリル:ナビエ・ストークス運動方程式



次は運動量!ある流体の微小なコントロールボリュームに作用する力を考えます。
密度を\rho、流体の質量分率を\phiとすると、コントロールボリュームの面より単位時間あたりに流入する質量は

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {ax}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

となります。ここで、\Delta x離れた面から流出する質量を考えたとき、テイラー展開の第2項までをとり、高次項を無視すると、

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right) +\Delta x\dfrac {\partial } {\partial x}\left( \rho \phi u-pf_{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

したがって、単位時間にx方向へ流出する質量は

$$
\dfrac {\partial } {\partial x}\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial \phi } {\partial x}\right) {\Delta V}
$$

となります。

これは、x方向のみなので、コントロールボリュームをデカルト(x,y,z)の3次元として、同様の式を解いていくと、

$$
\Biggl( \dfrac {\partial } {\partial x}\left( \rho \phi u-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi v-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right)+\dfrac {\partial } {\partial z}\left( \rho \phi w-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)\Biggl)\Delta V
$$

となります。単位時間・単位質量あたりの質量をS_{\phi }とすると、\Delta V\rightarrow 0\Delta t\rightarrow 0とすると、次の式となります。

$$
\rho S\phi =\dfrac {\partial \rho \phi } {\partial t}+\dfrac {\partial } {\partial x}\left( \rho \phi _{u}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi _{v}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right) +\dfrac {\partial } {\partial z}\left( \rho \phi _{w}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)
$$

数式が長く、ごちゃごちゃします。そこで、一般形で次のように表します。

$$
\rho S\phi =\dfrac {\partial S\phi } {\partial t}+\nabla \cdot (p\phi u-\rho \Gamma _{\phi }\nabla \phi ) \tag{2}
$$

ここで、質量分率\phi=1、生成率S\phi=0とすると、いわゆる連続の式となります。

$$
\dfrac {\partial \rho } {\partial t}+\nabla \cdot \left( \rho u\right) =0 \tag{3}
$$

デカルト (x,y,z)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {\partial \left( \rho v\right) } {\partial y} + \dfrac {\partial \left( \rho w\right) } {\partial z} =0
$$

で、円筒座標系 (x,r)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {1} {r}\dfrac {\partial \left( r\rho v\right) } {\partial r} =0
$$

やったー!

式(2)と式(3)から、次の式が得られます。

$$
\rho \left( \dfrac {\partial \phi } {\partial x}+\left( u\cdot \nabla \right) \phi \right) =\nabla \cdot \left( \rho \Gamma \phi \nabla \phi \right) +\rho S_{\phi } \tag{4}
$$

ここで、 \phiは速度成分、 \Gamma \phiは動粘性係数 \nuで、密度が変化しないとみなせる非圧縮性流体を考え、かつ体積力が働かないものとすれば、単位質量あたりの x方向の運動量の生成率に対応する S_{\phi }

$$
S_{\phi }=-\dfrac {1} {\rho }\dfrac {\partial p} {\partial x} \tag{5}
$$

です。式(5)を式(4)に代入して、運動量をもとめると

$$
\rho \left( \dfrac {\partial u} {\partial t}+u\dfrac {\partial u} {\partial x}+v\dfrac {\partial u} {\partial y}+w\dfrac {\partial u} {\partial z}\right) =-\dfrac {\partial p} {\partial x}+\mu \left( \dfrac {\partial ^{2}u} {\partial x^{2}}+\dfrac {\partial ^{2}u} {\partial y^{2}}+\dfrac {\partial ^{2}u} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial v} {\partial t}+u\dfrac {\partial v} {\partial x}+v\dfrac {\partial v} {\partial y}+w\dfrac {\partial v} {\partial z}\right) =-\dfrac {\partial p} {\partial y}+\mu \left( \dfrac {\partial ^{2}v} {\partial x^{2}}+\dfrac {\partial ^{2}v} {\partial y^{2}}+\dfrac {\partial ^{2}v} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial w} {\partial t}+u\dfrac {\partial w} {\partial x}+v\dfrac {\partial w} {\partial y}+w\dfrac {\partial w} {\partial z}\right) =-\dfrac {\partial p} {\partial z}+\mu \left( \dfrac {\partial ^{2}w} {\partial x^{2}}+\dfrac {\partial ^{2}w} {\partial y^{2}}+\dfrac {\partial ^{2}w} {\partial z^{2}} \right)
$$

です。
これは!!!流体でもっとも重要な支配方程式である、ナビエ・ストークスの運動方程式ではないですかーーー!

数式が長く、ごちゃごちゃしているので、ナビエ・ストークスの運動方程式をベクトル表示で書くと次の式になります。

$$
\rho \biggl(\dfrac {\partial u} {\partial t}+\left( u\cdot \nabla \right) u\biggl) =-\nabla p-\mu \nabla ^{2}u
$$

上記のようにナビエ・ストークスの運動方程式非線形偏微分方程式で、これらを連立させて解くのは難しいです。そこで、初期条件・境界条件をきめ、式(3)の連続の式とともに、速度および圧力を決めて解いていこうよ!というのが、マジ流体力学です。

ちなみに、ナビエ・ストークスの運動方程式の左辺第2項の \left( u\cdot \nabla \right) uは、対流項とよばれていますが、絵文字っぽくてかわいいです。

4.まとめ

ずいぶん、昔のことなのできれいさっぱり忘れてましたが、ちょっと手を動かしてみれば、ぼんやり思い出しました。人間の記憶ってすごい。何年たっても、やり直せるもんだなと思いました。そして、LaTex大変だった。そっちは鮮明に蘇りました。

流れは人間の目に見えません。
けど、流れを数式で表現すれば、流れがどうなっているのがを知ることができます。
ロマンですね。

数学は嫌いではなかったなということも、すこしだけ思い出しました。

おわり。

[ポエム] 機械学習をどう学び始めるべきか!がぼんやり分かった
この、誰も読まないエントリを書くため、数値熱流体力学(CFD)ってなんだっけ?を、雑に振り返りました。

CFDを行うためには、大学初級レベルに求められる、(公式丸暗記ではない)数学の基礎知識が必須です。しかし、、、、

CFDの世界では、流れ場をどう捉えて、モデル化して、どう数式に落としこむかというところが非常に重要で、そこには熱力学および流体力学の本質にかかる極めて深い理解が必要です。本質、というと抽象度が高いですが、要は基礎となる考え方や学問が目指している方向感などです。

で、、、私が学生のころCFDを勉強していたときのモチベーションって一体なんだったんだろう?いったい、熱力学や流体力学はどうやって学んだんだろう?と振り返ったところ、ある、ものすごいことを思い出してしまいました。



というわけで、2017年は、広報や事務などの本業は笑顔でこなしつつ、趣味の世界は興味を持ったことだけを自由勝手にやっていきたいと思っています。

*1:数学的な観点でなぜなのかが知りたいですが、超難しそう。

Dockerをはじめましょう!

この記事は、次のカレンダーの12/5のエントリーです。
www.adventar.org


春までは、横浜医療情報専門学校のプログラミングサークルのメンバーだったのですが
今は、某SIerに勤めています。

あいかわらず、15:00になると
なにがあってもぜったいに帰宅する!!!!というスタンスで
がんばっています。

先生だったころは、医療IT科のAndroidアプリ開発やC言語/JavaEE/PHPやアプリケーション設計などの講義ばかり担当だったので
アプリケーションエンジニアだった人なのかな?と思われているひとがいるかもしれません。

が、、、、子どもを産む前は
ずっと、ネットワークやサーバなどのインフラ技術しかやってきたことがなかった、インフラエンジニアだったのです!

というわけで、、、、
みなさんに、一度は基盤技術の講義をしたかったなぁぁぁという想いを込めて
今日は、Dockerを紹介したいと思います。

Dockerは、ひとことでいってしまうと
「アプリケーションの実行環境を簡単に作ってくれるプラットフォーム」
です。

講義のときに、私がすごく苦労してたのを、見てたと思いますが
クラスみんなで同じ開発環境をつくる、というのはとても大変な作業です。
(プログラミングサークルのみんなにはずいぶん助けてもらいました!)

そこで、Dockerを使えば、Webアプリの実行環境をコードで定義して
それをビルドすることで、どの環境(学校配布PCでもクラウドでも)でも開発やテストができるようになります。

はじめてDockerを触る人向けに、ハンズオンの資料を作りましたので
ぜひ、バイトのない暇なときにでも、いちど手を動かしてためしてみてください!

docs.com




最後に、、、、
もう聞き飽きたと思いますが(笑)

  • ■ コードを書いてなんでもいいので動くもの作ろう!ものづくりの楽しさを知っておくと良いですね!
  • ■ 基礎技術に時間をかけましょう!OS/ネットワーク/C言語は単位を落とすことのないようしっかり!
  • ■ 資格とりましょう!体系的に学ぶことが大事です!


以上です。

学生生活しっかり、遊びましょう!!!!

【書評】TensorFlowで学ぶディープラーニング入門を読みました!

私は、某SIerのR&D部門に所属しています。

もともと業務でインフラまわりしかやってきたことがなかったのですが、部署内はAIをメインに研究しているエンジニア多数で、そろそろ私も・・・・

というわけで
これまで機械学習に縁がなかったインフラエンジニアが、9/27に発売の
TensorFlowで学ぶディープラーニング入門 (著)中井 悦司さん
を読ませていただきました。

f:id:dr_asa:20161016171819j:plain:w300

Amazon CAPTCHA

機械学習/データ分析となると、数学の高度な知識が必要になると思われている人も多いかと思いますが、本書を読むにあたり、行列計算や微分方程式あたりが理解できていれば、十分読み進められると思います。

難易度は、理系大学を卒業している人であれば、予備知識は不要かなと思います。ちなみに、私は学生時代、数値流体力学のシミュレーションをやっており、簡単な偏微分方程式などであれば解くことができます。

私のように、「なんとなく、機械学習ってむずかしそう。」みたいな先入観を持っている人
そういう方に、ぜひ手に取って読んでいただきたいなと思います。

というわけで、章ごとの紹介は次の通りです~。



1章:TensorFlow入門
1章は、TensorFlowを使うための環境構築やチュートリアルが説明されています。環境は、クラウドVM(Google Compute Engine)を使う手順で説明されています。が、すべてDockerで動きますので、付録を参考にすれば、WindowsMacOSのクライアント環境でも試すことができます。
チュートリアルでは、多次元配列によるモデルをつかった気温を予測するための数式を解く例で動作確認をしています。
表面的なことだけにとどまらず、本書の全体像が理解できるよう、分かりやすく丁寧に解説されています。



2章:分類アルゴリズムの基礎
2章では、まずロジスティック回帰による二項分類器で、与えられたデータを2種類に分類するモデルの説明があります。最初に数式を用いたモデルの説明があり、それをもとにTensorFlowをつかってコードで記述していくという流れになっています。あと、機械学習でのテストセットの考え方も非常に丁寧な説明があります。もとのデータの8割を使ってトレーニングを行い、残りの2割で正解率をするという例をとって、実際にコードを書いて確認できます。2/3節では、多項分類器によるMNISTデータをつかった手書き文字の分類についての解説があります。オーソドックスな話でしょうが、非常に丁寧な説明で、、、、ちょっと、わかった気になってしまったかもしれません(笑)



3章:ニューラルネットワークを用いた分類
3章では、ニューラルネットワークの構造についての解説があります。複数の数式を組み合わせたかたちで考えるというのが、具体的にはどういうことなのかが説明されています。実際に、MNISTの手書き文字のデータセットを使って分類していく手順を追えますので、多少???が残っても、手を動かしながら理解ができます。あと、TensorBoardがすごいので、、、、おぉおおおってなると思います。



4章:畳み込みフィルターによる画像の特徴抽出
4章では、畳み込みフィルタについての解説があります。そもそも畳み込みフィルタって何・・・・・ってなるのですが、画像処理ソフトで元画像をぼかすための考え方ですと、冒頭に説明があるので、抽象度が高い内容ではありますが、あまり詰まらずに読み進めることができます。ここは数式自体は非常に単純なので、TensorFlowでの実装もわかりやすいです。



5章:畳み込みフィルタの多層化による性能向上
5章では、多層型の畳み込みフィルターによる特徴点の抽出の説明があります。最後に本書のまとめとして、手書き文字を認識するサンプルがあります。あと、カラー画像の分類の話や誤差逆伝播法の数学的な解説がありました。



本書を通して、
「解説が、とてもわかりやすい!」
です。

本書は、1章から5章にかけて、問題がだんだん難しく複雑になっていく構成になっており、1節ずつ読み進めていくと、だんだん全体がわかってくるようになります。これは、中断しても、続きから再開しやすく「今日はここだけやろう!」など学習がしやすくなっていて、挫折しにくいのが特徴です。
どの部分も、「なぜ、その数式でモデル化するのか」「数式をどう解くのか」「それをどのようにコードに落とすのか」が丁寧に説明されています。

というわけで
ディープラーニングについて本質的なところをきちんと理解した上でTensorFlowを動かしたいという人におすすめの本です~。

書籍は9/27より発売中で、すでに重版も決まっているそうです!!!!
中井さん、どうもありがとうございました!

【書評】[改訂新版]プロのためのLinuxシステム構築・運用技術 を読みました!

何の話かというと

クラウドが世の中に浸透して、だれもが気軽にLinuxを触る機会ができました。
ほんとうに素晴らしい世界です。

というわけで、9/22に発売の
[改訂新版]プロのためのLinuxシステム構築・運用技術 (著)中井 悦司さん
を読ませていただきました。


f:id:dr_asa:20160925224638j:plain:w300

Amazon CAPTCHA


本書の「はじめに」の抜粋です。


今、この文章を読んでいる皆さんは、何らかの形でLinuxサーバーの構築、運用にかかわっている、もしくは、かかわろうとしていることでしょう。お客様先ではじめてLinuxサーバーを構築した時、インストールメディアからサーバーが起動せずに途方に暮れた経験はありませんか?導入が終わってバックアップを取ろうとしたら、どうしてもテープドライブが認識せずにマシンルームで一夜を明かしたことはありませんか?お客様から、サーバーの障害の原因を調べるように突然依頼されて、お客様の視線を背中に感じながら、震える手で、何度も同じコマンドを叩いたことは?問題を解決しようと思って、設定ファイルを修正していく間に、どこを修正したかもわからなくなってしまいその場から・・・・・

この「Linuxサーバー」を「商用Unixサーバー」に読みかえると、まさに昔の私、、、、
そして、わたしと同じような人は、たくさんいるかとおもいます!!!
そういう方に、ぜひ読んでいただきたいなと思います。

初版から変わった部分として、RHEL7対応、systemd!などがありますので、初版を持っている方もぜひ買いなおしましょう~!

というわけで、章ごとの紹介は次の通りです~。



1章:Linuxサーバーの構築
1章は、ハードウエアやOS起動のしくみ、GRUB2のしくみ、実際にインストールする手順がとてもわかりやすく説明されています。わかりやすいだけでなく、「なぜ、そうなるのか」「○○という理由で▲▲したほうがいい」という記述がたくさんあって、1章とは思えないほど、読みごたえがあります。あと、RHELのキックスタートによる自動インストールに関する説明があります。ネットワーク経由でのインストールを理解するうえで必要な、ネットワークの知識やDHCP/TFTPサーバなどの知識もきちんと解説されています。



2章:Linuxサーバーの運用の基礎
2章では、なんと、Linuxサーバーの運用に関する説明があります。しかも、50ページ以上も!もうこれは、、、すごいとしか!

なにがすごいかというと、、、2点あります。
まず、1点目は、、
Linuxに限らず、システム基盤に関しては、構築も大事ですが、いかに優れた運用のしくみを考えてまわすが、安定稼働のカギになります。が、運用というのは、そのシステムのもつミッションクリティカル度合いや企業文化などに依存します。よって、書籍に「一般的な話」として語ることが非常に難しいため、ぼやっとした抽象的な話をのせるにとどまるケースが多いのですが、非常に体系だって分かりやすく整理されています。

2点目は、、、
書籍の構成上、設計=>構築=>運用という時間の流れに沿って書くほうが、読み手にとってわかりやすいため、運用は最後の章などに置かれることが多くなります。が、前述したように運用をふまえたうえで、設計・構築しないと、いろいろ詰む、、、というのがきちんと見えてるホンモノの編集者の方なんだなぁということが分かりました。すごい。



3章:Linuxのストレージ管理
3章では、Linuxのストレージに関する説明があります。まずSANの詳細についての説明、つづいてLVMの詳細についての説明があります。ここでは特に、Device Mapper Thin-Provisioningの説明は大変分かりやすかったです。Dockerを理解する上では、dm-thinはきちんと勉強しておかなければならないのですが、ブロックプールと論理デバイスの関係が図できちんと説明されています。



4章:Linuxのネットワーク管理
4章では、Linuxのネットワークのしくみに関する説明があります。IPアドレスイーサネットフレームの構造など基礎からはじまり、ルーティングに関しての説明があります。つづいて、ネットワークアーキテクチャーとしてスイッチの二重化とVLANについての説明があります。それらを理解するうえで必要になるSTPやHSRPやVRRPなどのしくみが解説されています。Linuxで設定する手順もありますので、手を動かしながら確認できます。最後にソケット通信に関する詳しい説明もあります。



5章:Linuxの内部構造
5章では、これまでとはことなり、Linuxの内部構造がどうなっているかの説明があります。例えば、プロセス管理やメモリー管理のしくみ、ファイルシステムのしくみなどです。ものすごく濃厚な内容です。私の頭脳ではすべてをきちんと理解できないのですが、図が多用されているので、「なるほど、こんな感じなのね!」というのがわかるだけでも、世界の見え方が大きく変わると思いました。



6章:Linuxサーバーの問題判別
6章では、システム障害時におこなうべきことが具体的に解説されています。ログの確認方法やカーネルダンプの取り方、パフォーマンスの問題判別などがまとめられています。この章は、必見です!

ここは初版から変わっていない部分なのですが、6章の冒頭に書かれている、サーバーで問題が発生した時に最初にすべきこと、、、、を読んで、涙がとまらなかったのを思い出しました。ずっと、エンタープライズシステムに携わってきたので、言葉にはできない、いろいろな想いがありますね。



本書を通して感じたことですが、
「解説が、とにかく深い!」
です。
中井さんの本は、本書にかぎらずご自身の体験をもとに執筆されているんだろうなということが、伝わりますし、その体験から得た知識がいずれも尋常じゃないほど深いというのが、本文だけでなくコラムからもひしひしと伝わります。

ちなみに、私は業務でLinuxサーバーを一度も触ったことがありません。出産後にこれらの本を読んで独学で勉強しました。
もともと商用Unix系でしたが、出産で離職してしまったのでSPARCサーバーを自宅に買って勉強するわけにもいかず・・・

f:id:dr_asa:20160925224751j:plain:w500

Linuxは、オープンです。また、クラウドの登場により、ハードウエアの制約からも解放され、勉強したい!と思っている人、たとえば女性でも主婦でもお母さんでも、どんな人でも平等にチャンスが訪れました。

インフラ技術は「やってみないとわからない」ことばかりですが、やみくもにやったからといってわかるわけではないので
なにごともきちんと理解しながら手を動かしたいという人におすすめの本です~。

書籍は9/22より発売中です!!!!
中井さん、ありがとうございました!