数理的手法を使いやすくするためのソフトウェア開発

科学技術計算とデータサイエンスについて

転職して半年、材料科学分野でのデータ分析に従事

今の職場での仕事をこなしたり学んだりするのに忙しすぎて、最近、なぜ転職したのかを忘れかけています。しかし、なぜ前の職場から出ようと思ったかは、今の職場でこれからどうするかを考えるために重要なことです。なので、忘れないうちに、書いておきます。

なぜ前の職場を出ようと思ったか

フォートランプログラムのチューニングという仕事に絶望したからです。ただ、計算科学シミュレーションや、前の勤務先、前の勤務先での他の仕事のどれについても悪く言うつもりはありません。私が絶望したのは、チューニングの大半を占める 単純作業で、コンパイルオプションをただ変えるだけという退屈きわまりない繰り返しについてでした。そして、絶望した理由は、転職前の数年間、フォートランの部署に籍を残したままで、機械学習ソフト開発の部署で仕事をさせてもらっていたからです。機械学習ソフトの開発が自分の趣味嗜好に合致して、その仕事に希望を見出したがゆえに、フォートランの仕事に絶望したのです。C++Python が刺激的であるがゆえに、フォートランが古臭く思えたのです。

他方で、機械学習の仕事をするようになってからも、フォートランの部署に所属していることになっていたので、いつかはフォートランの仕事に戻ることになると分かっていました。なので、それを避けるために、社内転職活動をするようになりました。

しかし、社内転職できないまま、フォートランの世界に戻されることが確定しました。そこで、その日から、社外への転職活動を始めました。

どんな職場に転職しようとしたか

転職先としては、学生時代からの計算科学のバックグラウンドと、最近の機械学習ソフト開発の経験の両方が活かせるところを、探すことにしました。

しかし、そんな職場はニッチ過ぎるとも思っていました。そこで、都合よくニッチな希望がかなうよりも前に、機械学習ソフト開発の経験を評価してくれる職場か、あるいは、データ分析ができる職場から内定が得られれば、そこに転職しようとも決めていました。

ところが、転職活動は私が思っていたより厳しいものでした。いや、私の年齢からすると厳しいのが当然でした。そして、転職活動の方針を考え直したほうが良いのだろうかと思い始めたときに、今の勤務先からの内定と、別のデータ分析に関連する会社からの内定、また、別の機械学習ソフト開発の会社から最終面接に進めるという知らせが立て続けに来ました。

こうして私は転職活動を終えました。

今の職場で何を目指すか

今は、計算科学シミュレーションや実験の結果を、機械学習で分析しています。バズワードで言えば、マテリアルズ・インフォマティクスの仕事です。しかし、バズワードと現実は違います。転職してから半年が過ぎましたが、マテリアルズ・インフォマティクスとして喧伝されるほどの大きなデータセットを、私はまだ、分析したことがありません。

このデータサイズの小ささについて、 マテリアルズ・インフォマティクスビッグデータでなくスモールデータを扱う分野なのだ、という人もいます。しかし、私はそうは思いません。まだ、シミュレーションや実験によるデータの収集が進んでいないからだと思っています。

なので、実験結果のビッグデータを扱えるように、また、計算科学シミュレーションでデータを効率的に収集できるように、職場の計算インフラの整備を進めています。この整備には、前の勤務先で習得したスキルが役立っています。

こうして、計算科学のバックグラウンドを活かし、機械学習で分析をして、計算機インフラの整備をしているので、転職前の希望に近いところに来れたかもしれません。しかし、悩みもあります。それは、自分の専門として、計算科学シミュレーション、機械学習、ソフト開発のどこにも集中特化しておらず、力が分散してしまっているという悩みです。

私は、数理的手法を使いやすくするためのソフト開発をしたいので、マテリアルズ・インフォマティクスを使いやすくするためのソフトウェア・プラットフォーム開発に集中したいと思っています。しかし、所属部署が安定して利益を出せるようになるまでは、シミュレーションで分析する仕事をせずに、プラットフォームを作る仕事ばかりをしているわけにはいきません。かといって、専門を絞らずにあれもこれもという状態では、生産性を上げるのが難しいのです。

あるいは、単にいろいろと勉強不足なのかもしれません。それにしても、どうしたものか。。

macOS で .gpg ファイルを emacs から復号・編集・暗号化するために

Ubuntu で作った gpg ファイルを、macOSでも操作するために、必要なソフトをインストールして、設定しました。 (何をしたのか忘れかけているので、メモとして書いておきます。)

macOSバージョン

  • Mojave バージョン 10.14.6

Homebrew のインストール

参考:Qiita: macOSにHomebrewをインストール

$ /usr/bin/ruby -e \
"$(curl -fsSL \
https://raw.githubusercontent.com/Homebrew/install/master/install)"

emacs のインストール

参考:Qiita: homebrewからインストールできるemacsの違い

私は、ターミナルでemacsと打ったときには別ウィンドウでemacsが開いてほしいので、cask版emacsをインストールしました。

brew cask install emacs

gpg のインストール

参考: OS X の Emacs で EasyPG が gpg2 で Opening input file: Decryption failed, になったので対処した

他に以下をインストールしました。

  • gnupg: stable 2.2.17
  • pinentry: stable 1.1.0
  • pinentry-mac: stable 0.9.4

設定

emacs で、gpg ファイルを復号化して編集できるようになるまで、試行錯誤が必要でした。

参考: Login Register gpg 2.2 and epa

$ cat ~/.gnupg/gpg.conf 
ignore-mdc-error

参考: OS X の Emacs で EasyPG が gpg2 で Opening input file: Decryption failed, になったので対処した

~/.gnupg/gpg-agent.conf を作成して pinentry-program /usr/local/bin/pinentry-mac という設定を入れたところ、 Emacs 上でも *.gpg ファイルを開くときに pinentry-macパスフレーズをきかれるようになって、開けるようになりました。

$ cat .gnupg/gpg-agent.conf
# allow-emacs-pinentry
pinentry-program /usr/local/bin/pinentry-mac

注意すること

.gpg ファイルを編集・暗号化すると、そのパスフレーズは gpg-agent にキャッシュされる

なので、そのパスフレーズ で、.gpg ファイルが復号できるかを確認するには、パスフレーズを入力したターミナルとは、別のターミナルから、emacs を立ち上げる必要があります。

そこで、gpg-agent を一旦、止めて、再起動してから、.gpg ファイルが復号できるかを確認しています。(もっとスマートな方法を探していますが、わからないので。)

$ gpg-connect-agent killagent /bye
OK closing connection

$ gpg-connect-agent /bye
gpg-connect-agent: gpg-agentが実行されていません - '/usr/local/Cellar/gnupg/2.2.17/bin/gpg-agent'を開始します
gpg-connect-agent: agent の起動のため、5秒待ちます...
gpg-connect-agent: agent への接続が確立しました。

こうしないと、キャッシュされたパスフレーズemacsはその.gpgファイルを復号化してしまいます。

iCloud のDocumentsフォルダに、change directory するには

MacBook Air の使い方がまだわかっていないのかもしれませんが、 デフォルトでファイルは iCloud に保存するようになっているようです。

参考: ターミナルからiCloud driveに移動する方法

$ cd /Users/${USER}/Library/Mobile\ Documents/com~apple~CloudDocs/Documents

ニューラル機械翻訳は複数の形容詞を正しく並べられるか?

英文法のオンライン講座で、11種類の形容詞を並べるときの語順

  • (number) (opinion) (size) (shape) (condition) (age) (color) (pattern) (origin) (material) (purpose)

を習いました。具体的には、形容詞で名詞を修飾するときに、

  • 20 cute petite long clean new red lacy French silk wedding dresses

  • three attractive tall women

のような順序で並べるべきであるという規則です。

すると、この文法規則をニューラル機械翻訳に学習させることができているのかが、気になります。そこで、グーグル翻訳で試してみました。

  • [日本語の入力] 20のシルクのフランスのかわいい小柄な長くクリーンな新しい赤いレースのウェディングドレス

    • [英語の出力] 20 Silk French Cute Petite Long Clean New Red Lace Wedding Dress
  • [日本語の入力] 3人の背の高い魅力的な女性

    • [英語の出力] Three tall attractive women

出力された語順は、入力したときのままで、文法規則に沿って並べ替えられることはありませんでした。

日本語を英語に翻訳するとき、ニューラル機械翻訳が、主語・動詞・目的語などを正しい語順に並べ替えることができるのは、大量のデータでニューラルネットワークモデルを訓練したためなのだと思います。 にもかかわらず、形容詞の語順を学習させることができていないのは、訓練データのなかに、正確な形容詞の並べ替えについての十分な例が含まれていないからなのでしょうか。

MOOC(オンライン講座)のために英語力を向上させるには? (2)

あいかわらず、機械学習のオンライン講座を聴くたびに、英語力不足を感じています。しかし、情報が専門的になると日本語の情報が乏しくなってくるので、英語から逃げてばかりいるわけにはいきません。また、機械翻訳の精度が上がってきたとは言え、すべてのオンライン講座が自動翻訳されて日本語で学べるようになるまで^1待っているわけにもいきません。 そんなわけで、機械学習と並行して、英語学習も再開しました。

STEM領域の英語表現を学ぶことの効果は?

まず、前回ブログでの仮説、「英語でもSTEM領域の基礎を無理なく聞き取れるようになれば、MOOCの学習効率が上がる」に基づいて、

Coursera : English for Science, Technology, Engineering, and Mathematics

を受講して、修了しました。しかし、この講座は簡単すぎました。今でも、Machine Learning with TensorFlow on Google Cloud Platformを理解するために、あいかわらず、ビデオ講義を聞き直しています。(まあ、聞き直す箇所と回数は減ったのかもしれませんが。)つまり、これだけでは十分ではありませんでした。

初級と中級レベルのMOOCで何が違うのか?

そこで、English for STEMに対するML with TF on GCPの違いを考えてみると、次の2つです。

(1) 文が複雑、かつ、早口。 (English for STEM は初級レベルの内容を文法的に簡単で、かつ、短い文で説明していますが、ML with TF on GCPは専門的な内容を長い文で早口で説明しています。)

(2) 背景知識が少ない。(English for STEM の内容はすでに知っていたことばかりですが、ML with TF on GCPの内容には知らなかったことが多いです。)

このうち、(2)については、そもそも、知らなかったことを学ぼうとしているのですから、どうしようもありません。しかし、(1)は英語処理速度と文法理解を向上させることで、対処できるはずです。

もっと速く

それで、英語処理速度の目安として、読書スピードを入門者レベルの英文多読セットでの最後の5冊で測ってみました。平均して毎分138単語で、英語ネイティブの平均である300単語の半分以下でした[^2][^3]。なるほど、この処理速度では、毎分200単語程度で話されているビデオ講義が早口に感じられるわけです。

次に、文法理解力を測るために、Grammar in Use Intermediateの巻末テストを100問やってみると、6割弱の正答率でした。微妙です。。勉強嫌いとしては、文法なんか関係ないと言いたいところです。しかし、文法的な解釈で迷っているようでは、処理速度は上がらないのかもしれません。

そんなわけで、今は、英語処理速度^4 ^5と文法理解^6の向上に取り組んでいます。

参考

1^: オンライン講座は日本語化されていても、理解するためにある程度の英語力が必要なことがあります。例えば、Machine Learning with TensorFlow Google Cloud Platform SpecializationGoogle Cloud Platform Big Data and Machine Learning Fundamentals は、字幕は日本語化されているのですが、ビデオ講義のなかのスライドや音声は英語のままです。

2^: 日本人大学生の平均的な英語読書スピードは毎分80〜100単語で、TOEICのリーディング試験にきちんと全問回答するには毎分150単語以上のスピードが必要なのだそうです

3^: アメリカ人大学生の平均的な読書スピードは毎分400単語ということなので、彼らはビデオ講義を倍速で再生したとしても理解できるわけです。

4^: SSS推薦多読基本セット Elementary Set B エディション:SSS-3B-N

5^: SSS推薦多読基本セット Intermediate Set A エディション:SSS-4A-N

6^: Coursera "Learn English: Intermediate Grammar Specialization" offered by UCI

体内時計には朝型、夜型、中間型のほかに、イルカ型がある

私は早寝早起きはできないけれど、昼夜逆転の生活では生産性が明らかに下がってしまいます。なので、自分は朝型でも夜型でもなく、中間型なのだろうと思っていました。しかし、心理学者Michael Breusさんのサイトで調べてみるとイルカ型で、睡眠研究者の柳沢教授推奨するテストを受けてみると、中間型に近い夜型(朝型夜型得点 39)でした。

体内時計リズムは遺伝子で決まる

柳沢教授によれば、体内時計のリズムは、年齢による揺らぎはあるものの、遺伝子で決まっているのだそうです。なので、遺伝的に朝型でない人が無理に早寝早起きしたり、夜型でない人が夜ふかしすれば、生活の質は悪くなります。 たしかに、これは私の経験に合致します。また、年齢による揺らぎとして、幼児期は朝型でも、思春期からは夜型にシフトしていき、老人になると朝型に戻ることもあるいう研究結果が興味深いです。なるほど、私は小学生のころは早寝早起きだったのに、小学校高学年から夜ふかしをするようになり、大学院時代は大半の人が帰った後のほうが集中でき、年をとってから朝起きるのがそれほど苦痛ではなくなってきています。

体内時計のタイプを動物のイメージで分類

ただ、体内時計のリズムの分類は、研究者によって異なるようです。実際、柳沢教授推奨のテストでは、超朝型・朝型・中間型・夜型・超夜型の5つに分類しているのに対して、 Breus博士のサイトでは、 ライオン型・クマ型、オオカミ型、イルカ型の4つに分類しています。 この4分類の説明を読むと、 ライオン・クマ・オオカミはおおむね朝型・中間型・夜型に対応しています。 ただ、イルカ型というのが、朝型でも夜型でもない変なタイプであり、 Breus博士の独自の分類であり、柳沢教授推奨の分類では出てきません。

イルカ型とは?

イルカ型が朝型でも夜型でもないというのは、実は私自身が感じていたことでもあります。 まず、生産性のピークが昼前から夕方前に分散していて、朝でも夜でもありません。 そして、早起きしても夜ふかししても調子が悪いのですが、かといって、生活周期を一定に保っても、夜は寝付きが悪く朝は起きるのがつらいです。 ただ、経験的に、起床後にジョギングのような軽い運動をすると、 頭がはっきりして、ピーク時間帯の集中力が上がるようです。 この3つは、Breus博士がイルカ型の特徴として示していることでもあります。

体内時計リズムに逆らわずに生きるために

なので、Breus博士が、朝型、夜型、中間型のほかに、イルカ型というタイプを考えていることには、納得できます。 また、生活の質を上げるために、遺伝的な体内時計リズムに合わせて働き生活するのが良いという、睡眠研究者からの提案にも賛成です。 はじめは、ライオン型・クマ型・オオカミ型・イルカ型という分類は変わっていると思いましたが、 それぞれの体内時計リズムの型に応じて、 長期的な計画を立てるのはどの時間帯が最適で、 集中が必要な作業はどの時間帯で、ジョギング、筋トレはなどと、具体的なアドバイスが含まれているので、 スケジューリングの参考にしています。

MOOC(オンライン講座)のために英語力を向上させるには? (1)

英語で機械学習の専門コースを聞くのは、日本語で文学史の専門家から話を聞くのに、似ています。

恥ずかしながら、私には人文系の教養がありません。それで、文学史の話は、日本語であっても、その分野の用語や言い回しを知らないので、さっぱり理解できないのです。 同様に、特徴エンジニアリングの話は、日本語では理解できても、英語では機械学習分野の用語や言い回しに慣れていないので、理解するのに時間がかかります。

いえ、正確に言えば、専門分野に特有の表現に慣れていなくとも問題ないはずです。 むしろ、STEM(science, technology, engineering, mathematics)領域の基礎的な英語表現に慣れていないことが問題なのだと思います。 実際、日本語ではSTEM領域の基礎を話したり聞いたりすることができるので、自分の専門でない分野でも、無理なく学ぶことができます。 しかし、英語ではSTEMの基礎を話したり聞いたりする力がないので、自分の専門である物性物理、生物物理、有機化学くらいしか、すんなりと理解できないのです。

となると、英語でもSTEM領域の基礎を無理なく聞き取れるようになれば、MOOCの学習効率が上がるのかもしれません。

Coursera : English for Science, Technology, Engineering, and Mathematics

MOOC(オンライン講座)の所要時間は過小に見積もられている?

先月からすべての空き時間をCourseraでデータ分析を学ぶためにつぎこんでいます。全力で学んでいるのは、Kaggleで戦えるレベルに行くために、スケジュールを前倒しして進みたいからです。しかし、今は、前倒しどころか、〆切に課題を間に合わせるのが精一杯です。情けない。。 orz

すると、MOOCsを最優先と決めているので、ほかのことはなおざりになります。 今日は出かける予定をキャンセルして、課題に取り組んでいました。 課題とテストの〆切は時差の関係で月曜日になるので、毎週月曜日は大変なのです。 今までに、なんとか2つのコースを〆切に間に合わせたものの、まだひとつのコースが残っています。

もっと、学習効率を上げたいです。問題は、MOOCのための所要時間が、公式の見積もりよりも、長くなってしまうことです。

それにしても、MOOC運営者は所要時間を過小に見積もっているのではないでしょうか。 例えば、"Machine Learning with TensorFlow on Google Cloud Platform Specialization" は、コースごとに所要時間見積もりを提示しています。 しかし、これらのなかの3つのコースを終えるために、すべて、公式の見積もり時間より長く掛かってしまいました。 この差異は、ビデオ講義の受講から生じました。 これに対して、テストや課題については、公式の見積もり時間と、私が使った時間はそれほど違っていませんでした。

つまり、私はビデオ講義を2回以上は再生しているので、どうしても、Googleによる所要時間の見積もりよりも、長く掛かってしまうのです。 おそらく、Googleの人たちは、このレベルの講義であれば、1回だけ聞けば十分に理解できるのでしょう。 ところが、私は、ノートを見直したり、早口で癖のある英語を、巻き戻して聞き直したりしています。 しかも、計算機科学の専門用語や特殊な言い回しが出てきたときには、それらの意味を調べたりしています。

他方で、この"Machine Learning with TensorFlow ..."を紹介している記事を読むと、このなかの5つのコースを1ヶ月で終えた、などと書いてあります。 となると、問題は、やはり、私の英語スキルと計算機科学の素養が不足していることにあります。 結局、中間レベル(intermediate)のMOOCを無理なく受講するには、アメリカの大学で専門科目の単位を取得できるだけの能力が必要なのかもしれません。

ともあれ、今日は、あとひとつ残った課題をがんばります。(16時間の時差のもとで〆切はすでに過ぎているのですが、採点してもらえるはず。)