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

kasajeiのブログ

機械学習と健康が最近の関心事です

ジョコビッチが世界一位になるためにやめた、たった1つのこと

マインドフルネス

f:id:kasajei:20160930001415j:plain

「ジョコビッチの生まれ変わる食事」という本を読んだ。

ジョコビッチが自らの体調不良に対する葛藤から、セトジェヴィッチ博士と体調不良を改善していく話、そしてどう食生活が変わり、どう良くなったのかということが書いてある。

ジョコビッチの世界一になる物語としても面白いし、食事に対する知見としてもとても参考になる。

ジョコビッチの生まれ変わる食事

ジョコビッチの生まれ変わる食事

ジョコビッチのストーリー

対処法がわからない不調

ジョコビッチは6歳のときに、ピート・サンプラスがウィンブルドンで優勝するのを見て、自分も世界一位になりたいと思った。

それから人生の全てを書けて優勝を目指して特訓してきたが、重要な試合で体調が悪くなり勝利を逃すことがあった。

全米オープンで、コートに倒れてしまうこともあった。

この体調不良を「喘息」と呼ぶ人もいれば「単なる調整不足」と切り捨てる人もいた。

フィジカルトレーニングはもちろん、メンタルトレーニングもしたが良くなることはなかった。

セトジェヴィッチ博士との出会い

テニスをTVで見ていたセトジェヴィッチ博士には、ジョコビッチの不調は「喘息」ではないことはすぐにわかった。

もしかしたら食べ物が原因ではないかということに気付き、ジョコビッチに会いに行った。

テストをした結果、ジョコビッチは「グルテン不耐症」であることがわかった(グルテンは小麦に含まれるタンパク質)。血液検査からも、小麦と乳製品に対する不耐症があり、トマトに対しても少し敏感であることがわかった。

それらの食品をセトジェヴィッチ博士から食べないようにと指示された。ジョコビッチは「先生、待ってくださいよ。うちの両親はピザ屋なんですよ!」と答えた。

ジョコビッチが好きだったものをやめないと、世界一位になれないことを知り、抵抗した。博士からまずは2週間やめてみることを提案された。

小麦を絶って食事を改善し世界一になったジョコビッチ

2週間、小麦を絶ってから、試しに小麦を食べた。思考に「霧」がかかった感じがした。グルテン不耐症の実感がわき、小麦を断つことを決心した。

そこからセトジェヴィッチ博士と様々な食事改善をして、念願の世界一位になった。

実家のピザ屋の「レッドブル」は、今ではグルテンフリーのレストラン「ノバク」に変わった。

僕の話とグルテンフリーのすすめ

この本を読んでから、僕はグルテンをほぼ絶っている。特に困ってはいない。それよりも良いことのほうが多い。

本の中でジョコビッチがやったように、ジョコビッチも読者に向かって2週間グルテンを絶ってみてほしいと書いている。ぜひ試してみてほしい。

アレルギー性鼻炎が治った

昔から、アレルギー性鼻炎だった。アレルギー性鼻炎って、なんのアレルギーなんだ、って思ってた。でも原因はよくわからず、薬を飲んで、収めることしかできなかった。

グルテンをやめてから、アレルギー性鼻炎の発症が、とても少なくなった。「ずっと」と言っていいほど鼻詰まりだったのが、治った。

花粉症も治ったかもしれない。

原因不明の鼻詰まりに困ってる人は、グルテンをやめてみると良いと思う。原因不明の体調不良の人もやめてみると良いと思う。

特別な人の話ではない

グルテンアレルギーの人は気付いてないだけでたくさんいる。血液検査で調べるでもいいし、ジョコビッチが提案するように2週間やめてみてほしい。

グルテンアレルギーは、たまご、牛乳に次ぐ第三位。しかし、自分の周りでも、グルテンアレルギーだからラーメンが食べられないという人は聞いたことがない。

ジョコビッチがそうであったように、食べていても際立った不調にはならない(世界を争うようなレベルで足かせになる)。

なんとなく鼻詰まりがしたり、喘息的な症状が出たりするだけだ。他のいろいろな不快な症状もグルテンが原因かもしれない。

隠れたアレルギーなので、自分は違うと思っていてもぜひ一度チェックしてみてほしい。

グルテンはやめても問題はない

グルテンをやめたところで、さほど問題はない。米を食べれば良い。

ラーメンもやめれるし、お菓子もやめられる。きっと痩せる。僕は痩せた。

積極的に食べる理由はないように思える。

全てのグルテンを排除できるのか

全部のグルテンを排除するのはとてもむずかしい。醤油にも小麦粉は入っている(できれば入ってない醤油を選びたい。でも外食では難しい。)。

それに天ぷらは美味しい(油の関係で最近は積極的には食べないことにした)。

そんなこんなで全部をやめるのは難しいので、主食で食べることをやめることをおすすめしたい。

僕の持論で正確かどうかはわからないが、花粉症のようにある一定以上のグルテンが貯まると、アレルギーが発症すると考えているので、ある程度ならば食べても大丈夫だろうと思っている(詳しい人がいたら教えて欲しい)。

かといって食べてよいという話ではないので、極力避けていきましょう。

ジョコビッチの食事

ジョコビッチの本にはグルテンだけではなく、ほかの食事についても書いてあるので、ぜひ参考にしてほしい。

プロスポーツ選手がどんな食事をしているかを知るのにはとても良い本だと思う。

いろいろ書いてあるので、まずはグルテンを断つところからはじめましょう

ジョコビッチの生まれ変わる食事

ジョコビッチの生まれ変わる食事

#PyConJP 2016 に参加しました

Python 機械学習

f:id:kasajei:20160926000144j:plain

Python歴3年目ぐらいにして、PyConJPに初めて参加しました。今年は大きめの技術系のカンファレンスに何個か出席しています。

大きめのカンファレンスは、チケット代はそこそこしますが、お弁当とかディナーがあったりしていいですね。海外からの招待講演などもあるので、いろんな話が聞けたりします。

今回は、仕事柄興味のあるデータ分析まわりのお話を中心にトラックを選びました。

続きを読む

Googleでのマインドフルネスプログラム「Search Inside Yourself」の本

マインドフルネス

サーチ・インサイド・ユアセルフ――仕事と人生を飛躍させるグーグルのマインドフルネス実践法

サーチ・インサイド・ユアセルフ――仕事と人生を飛躍させるグーグルのマインドフルネス実践法

  • 作者: チャディー・メン・タン,ダニエル・ゴールマン(序文),一般社団法人マインドフルリーダーシップインスティテュート,柴田裕之
  • 出版社/メーカー: 英治出版
  • 発売日: 2016/05/17
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Googleでマインドフルネスのプログラムがあると知ってからとても興味を持っていたSearch Inside Yourselfの翻訳本がついに発売されました

「この本とプログラムはグーグルの文化の最高の部分を表しています」 ――エリック・シュミット(グーグル会長)

とエリック・シュミットもお墨付きです。

また、EQ こころの知能指数の著者であるダニエル・ゴールマンが序文を書いています。

なぜGoogleの社員は、楽しく創造的に働き、柔軟性を持ち、優れた成果を上げられるのか? その鍵を握るのが、独自の研修プログラム「サーチ・インサイド・ユアセルフ(SIY)」。

序文ではGoogleで公演したときの話も書いてあり、面白かったです。

Googleで実践され、生産性を20%向上させたと言われているプログラムの本で、内容満載です。

マインドフルネスの考え方や、実践されている瞑想のやり方も書いてあります。

Googleのこのような取り組みはとても面白いですね。

優秀な人材を採用することもさることながら、こういった取り組みによってさらに生産性を向上させていく。

さらにプログラムとして作り上げ、公開していくというのも良いですね。このプロジェクトを推進しているメンがエンジニアというもの面白い。

Googleの本はどれも面白い。おすすめです。

サーチ・インサイド・ユアセルフ――仕事と人生を飛躍させるグーグルのマインドフルネス実践法

サーチ・インサイド・ユアセルフ――仕事と人生を飛躍させるグーグルのマインドフルネス実践法

  • 作者: チャディー・メン・タン,ダニエル・ゴールマン(序文),一般社団法人マインドフルリーダーシップインスティテュート,柴田裕之
  • 出版社/メーカー: 英治出版
  • 発売日: 2016/05/17
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Djangoのauto_nowなのにアップデートされないことがある

Python

Djangoのモデルには、DateTimeFieldがあり、その引数として、

  • auto_now_add : create時に現在時刻を入れる
  • auto_add : save時に現在時刻を入れて更新する

という便利な機能があります。よく

class User(models.Model):
     name = models.CharField()
     created = models.DateTimeField(
        auto_now_add=True
     )
     updated = models.DateTimeField(
        auto_now=True
     )

のような形で定義して、使っています。

auto_nowで更新される

このようなフィールドを持ったモデルで

user = User.objects.create(name="kasajei")
print(user.created)
>>> 現在時刻
print(user.updated)
>>> 現在時刻
user.name = "kasajei2"
user.save()
print(user.updated)
>>> 保存した時刻

となり、updatedには現在の時刻を設定して、saveしなくてもDjangoが値を入れて更新してくれます。便利!

auto_nowなのに、更新されない

しかし、たまーに、更新されないなぁと思っていたら、以下の用に、updateで引数を指定するようなケースでは更新をしてくれないみたいです

user.name="kasajei3"
user.save(update_fields="name")
print(user.updated)
>>> 更新されてない!!

他にも、

User.objects.filter(name="kasajei").update(name="kasajei2")
user = User.objects.get(name="kasajei2")
print(user.updated)
>>> 更新されてない!!

なども更新されません!

ちゃんと発行されているSQL見ればわかるのですが、auto_nowを信用しすぎていて、しばらく気づきませんでした。

auto_nowなんだから、更新してくれてもいいのになぁなんて、思ったりしますが、どうなんでしょう。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

AjaxアプリケーションでもDjango Debug Toolbarを使いたい

Python

最近のサービス構成

最近作ってるサービスでは

  • APIサーバー[Django]
  • Web, iOS, Android

のように構成することが多く、Djangoはjsonを返すAPIサーバーとして使うことが増えました。

Django Debug Toolbarが不便である

すると、Djangoで便利だった、Django Debug Toolbarが、便利には動かないのですね。(Django Debug Toolbarは各APIでのパフォーマンスを知ることができる便利なデバッグツールです。SQLの履歴が出るので、主にこれを見ています)

github.com

もちろん、各APIのURL叩けば動いてくれますが、JSONが表示させるだけなので、

  • 何のViewかわかりづらい
  • POSTがめんどくさい
  • ユーザー認証が面倒くさい

などという問題があります。

続きを読む

ざっくりわかる機械学習

機械学習

機械学習は統計学的な手法から発展してきたこともあり、ベイズの定理による確率論的な定式化が一般的である。しかし、最近流行りのディープラーニングなどを理解しようと思うと、決定論的な立場から定式化しておくほうがわかりやすいと思われる。

僕はこのように理解しているという感想記事です。わかりやすいかはわかりませんが、ざっくりはわかると思います。

教師あり学習の定式化

教師学習とは  {f: \mathbb{R}^{n}→\mathbb{R}^{m}} : 関数に対して、  {\mathbb{D} \subset \mathbb{R}^{n}} : 学習データ上の値が与えられた時、

 {\mathbb{F}:\mathbb{R}^{n}→\mathbb{R}^{m}} : 関数族(モデル)と {Cost:\mathbb{R}^{m}\times \mathbb{R}^{m}→\mathbb{R}} : コスト関数を選び、

コスト関数の総和

 { \displaystyle
 \sum{}_{x_{i} \in \mathbb{Y}}Cost( f(x_{i}), f^{*}(x_{i}))
}

を最小化(*アルゴリズム)し、かつ任意のテストデータ {\mathbb{T} \subset \mathbb{R}^{n}}に対しても、

 {\displaystyle
 \sum{}_{x_{i} \in \mathbb{T}}Cost( f(x_{i}), f^{*}(x_{i}))
}

が最小となる(*汎化性)ような、 {f^{*}\in\mathbb{F}} を選ぶことである。

と定式化してみる。これにより、なにがヒューリスティックに選ぶべきもので、なにがアルゴリズムなどで行うものなのかが明確になり、どこの議論をしているのかがわかりやすくなると思う。

回帰と分類

 {f}の値域が {\mathbb{N}}の有限部分集合であるとき分類と呼ぶ。それ以外を回帰と呼ぶ。

としておいたほうがわかりやすそう。Wikipediaには値域が連続値って書いてあるけど、階段関数のような非連続な関数に対しても機械学習は行われるはずで、それは分類とは呼ばないはずなので、このように定義しておくのが無難だと思う。

モデルについて

モデルの種類はさまざまである。モデル選びはヒューリスティックであり、学習データや関数によってここを上手く選ぶことが重要である。

モデルとして、線形写像を選べば、線形回帰と呼ばれたり、パーセプトロン(線形での分類)と呼ばれたりする。線形なので、線型写像の近似か、超平面での分類しかできない。

またニューラルネットワークや多層パーセプトロンやCNNやRNNなどもモデルの名前である。これらは素子の数を十分増やせば任意の関数を近似できることが知られている。

どの問題に対して、どのようなモデルが最適化はさまざまな研究がなされているので、機械学習を使う側としてはここの流れを追いかけるのが面白いところである。やってみた!系の記事はどのデーターに対してどのモデルでどのような結果が出たかを見ると良いと思う。

コスト関数について

モデルによってや、問題によって使うコスト関数は変わる。回帰の場合は二乗誤差が使われることがおおく、分類の場合にはクロスエントロピーを使われることが多い。

値域に対して、どのような距離空間を入れるかという話と、学習がしやすいような関数にできるかと言う話がある。

たとえば二乗誤差は直感的にわかりやすい距離であり、またパラメーターが線形の場合は下に凸の関数なので、極小値があることがわかっているので学習に使いやすい。

クロスエントロピーは0付近で無限大の値を取るので、答えを間違った時のペナルティが大きく学習のスピードが早い。

特殊なことをしないかぎりは上記の2つを使うのが良いと思う。(と言いつつ、それ以外を僕はあまり知らない)

コスト関数の最小化について

(*アルゴリズム)のところの話である。ここは主に与えられたデータからどのようにして最適な{f^{*}}を最速で探すのかが議論になる。

さまざまな方法が提案されており、最急降下法や確率的勾配法やミニバッチ。まだニューラルネットだとバックプロパゲーションやAdaGradやAdamなどが発明されている。

この分野はアルゴリズムが好きな人は追いかけるとよいと思う。機械学習初心者はここを理解しようとすると大変なことになるので、最急降下法ぐらいを「構成している関数の各パラメーターで偏微分してその値の逆方向にパラメーターをすすめることで、コスト関数の極小値にたどり着くんだろうなぁ」ぐらいの感覚として理解しておくぐらいにとどめ、あとは便利だなぁぐらいでいいと思う(といって僕は逃げます。僕もちゃんとは勉強してないのでわからない。)

汎化性について

汎化性とは、任意のテストデータに対しても、コスト関数が小さくなっていることであり、これはつまり予想が上手く行っている!ことを表す。

ここが機械学習で一番厄介で、理論的に話をすすめるのが難しく、しかし重要なところである。

まず、汎化性には

  • モデルの選定
  • コスト関数の選定
  • 過学習の問題
  • 学習最適化

が主な議論対象となる。モデルとコスト関数に関しては上記で見たので過学習と学習最適化について取り上げる

過学習

学習データが少ない時に表現力が高いモデルを選んだ時に起こりがちなのが過学習である。

たとえば、学習データーが5つの点の値のみ与えられていて、モデルを4次元の多項式とすると変数は5個あるので、連立方程式を解くことができ、学習データに関しては完全にフィットすることができてしまう!

これに対する対策として様々なテクニックが考えられており、例えばL2正則化もそれに当たる。これはパラメーターに対して、値を大きくなり過ぎないという制限をつけることで過学習を防ぐことを目的としている。

ほかにはニューラルネットワークではドロップアウトと言われる手法が知られており、これは各素子が50%などの確率で不活性化することにより過学習を防いでいる。

また学習データに対してランダムなノイズをのせることで過学習を防いだりしている。

学習最適化

コスト関数を最小化することは上手くいくが未知のデータに対してうまくいかないことも多い。それが過学習によって成されるケースもあるが、例えばニューラルネットだと各層での役割分担が上手く行っておらず特徴を抽出しきれてないというケースもある。

そこで事前学習を行いパラメーター空間を整理しておくことで、学習を上手くいかせる手法も考えられている。このとき多くは教師なし学習で行われる。

これがディープラーニングの転機になったRBMやAutoencoderによる事前学習である。

データの前処理

機械学習で重要なのは、データセットを上手く作れるかというところが最終的には一番の問題になったりする。大体のローデータは汚いので、それを学習するために綺麗に整えないといけない。また教師あり学習をするときには教師データが必要で、それを準備するのも大変だったりする(エンジニアが大量のネイル画像を分類しなければいけない!)

ここに関してもデータの正規化などでデータを綺麗にしたり、学習データを回転したりノイズをのせることで学習データを増やしたりしている。

まとめ

教師あり学習を決定論的に定式化してみた。すると機械学習ででてくるワードがどこの部分に対しての話なのかが少し明確になったのではないでしょうか。

僕だと、機械学習を使う方に今は興味があるので、モデルの選定や汎化性やデータの前処理に興味があるのでここに関してはある程度理解し、アルゴリズムなどに関しては、Scikit LearnやTensorflowやChainerなどに任せてしまおう!と思うことができる。(後々学びたいとは思っている)

「巨人の肩の上に立つ」じゃないけど、得意なことややれることは人それぞれで、時間も有限なので、効率的に楽しいことをやっていきたい!

その一助になればとお思い、ちょっとざっくりですが、機械学習について説明してみました。そして僕の理解はこんなもんです。

まだまだ機械学習やり始めて間もないので、いろいろ教えていただきたいです。

計測してないものは改善できない!時間の管理を考えてみた

マインドフルネス

「早起き」の技術という本を読んで、時間を有効に使おう!という意識が芽生えたので、いろいろ調べて実行してみています。

計測してないものは改善できない

一日のうち自分のやりたいことにどれぐらい時間をさけていますか?と質問に対してなんと答えられるでしょうか?

僕は、実際どれぐらい時間を使っているのかわからない!としか回答できないことに不安を感じました。

仕事中もどれぐらい何に時間を使っているのかがわからないと、仕事内容も改善のしようがありません。

もっと本を読む時間を増やしたかったり、友達と飲みに行く時間を増やしたい。しかし、なんとなく忙しい気がする。けど何に忙しいのかわからない、という状況でした。そうすると改善の余地もありません。

「計測してないものは改善できない」とはまさにこのことです。

成功のための9ステップという本には、経営者に「何時間重要な時間を過ごせていますか?」と聞くと「1日の半分以上重要な時間だ」と応えるみたい。しかし、そもそも時間を測ってもいないのにわかるはずがない!と書いてあって、計測の重要性を思い知りました。

続きを読む