hidekatsu-izuno 日々の記録

プログラミング、経済政策など伊津野英克が興味あることについて適当に語ります(旧サイト:A.R.N [日記])

サーバーレス・コンピューティングの終着点

最近、クラウドはもはや前提となり、さらにサーバレスが当たり前に使われるようになってきている。サーバーレスという言葉が出ると、サーバーばないという話ではないよ、という話が出たものだったけれど、もはやそんな枕言葉が不要になるくらいに普及している。

クラウドで開発が変わるという話もあったが、Google が最初に提唱した PaaS 的な方法論はあまり流行らず、従来型の三層アーキテクチャ(Web-AP-DB)を実現できる IaaS+α を推し進めた AmazonAWS が勝利を得た結果、開発手法そのものには大きな変化はなかったように思う。しかしそれも、サーバーレスの登場でフェイズが変わるかもしれない。

究極のインフラ環境というものを想像したとき、制約を無視すれば無償で無制限に資源を使えるというものだろうが、経済学が教えるように資源は有限である。その前提で考えれば、使った分だけコストがかかる、が真に実現できた状況こそ究極のインフラ環境と言えるだろう。

それがクラウドなんでは? と思われるかもしれない。しかし、例えば、EC2 にしろ RDS にしろ、起動しているか起動していないかで決まっており、CPUやメモリなど実際のリソース使用量によって決まっているわけではない。

もちろん、スケールアップに頼るのではなくスケールアウトすれば良いわけだが、その粒度が問題となる。サーバーレスの登場で従来はサーバー単位だったものがリクエスト単位にまで分割できるようになった。

すでに「サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス」という書籍が出ているけれども、おそらくこれからのWebアプリケーションはこのような方法論がベースになるだろう。

HTML/JavaScript 層は、CDN やオブジェクトストレージにも配置できる静的リソースとして作成し、そこから API Gateway を通してREST でサーバーレスの処理を起動する。すでに静的リソースに関しては、ほとんどタダみたいな金額で公開できる。処理はサーバーレスとなり、使用した分だけ課金される、というだけでなく、スケールアウトも容易となる。現状は、DynamoDBのような NoSQL だけが使用量に応じた課金という体系となっており制約があるものの、Aurora がサーバーレス化されたように使用量での課金が可能な RDBMS が次の選択肢として出てくるだろう。

ここまで来れば、残された課題は、起動時間の遅さ(レスポンスの悪さ)だけだが、一定数の常設サーバの存在さえ許してしまえば問題ではなくなる。現時点では、サーバーレスとウォームアップの組み合わせをうまく扱う方法はないが、Kubernates の Knative が発展すれば自然にできるようになるだろう。今はサーバーレス=AWS Lambda という風潮が強いが、Knative のように特定のプラットフォームに縛られないサーバーレス基盤が発展していき自由度も高まっていくのではと思う。

このようなシステム構成が一般的になれば、Git リポジトリと資源の制約情報を与えるだけで、すべてをよろしくやってくれる究極の DevOpts が実現できるのではないかと思うし、世の中そこに向けて急速に進んでいくと考えられる。

 

 

褒めるべきか叱るべきか、それが問題だ(続)

以前、「褒めるべきか叱るべきか、それが問題だ。」というエントリを書いた。ただ、そのときにはうまく考えをまとめることができず書けなかったことがある。それは、「怒らないためには期待しなければよいのではないか」という点だ。

昨今、「アンガーマネジメント」という言葉が流行っているが、その方法論のひとつに「こうあるべきを手放す」というものがある。私自身を振り返って、なぜ自分は怒りの感情を持ってしまったのかと自己分析すると、ほとんど「期待したとおりに相手が行動しなかった」場合だったと思う。相手に対し怒りを覚えるのは、当然それ相応の期待や予測が存在するからで、そこに何らかの期待がないならば、怒る理由自体がそもそも存在しない。

だから、怒らないためには、いかに「期待を持たないか」ということが重要になる。とはいえ、一方で「期待を持たない」ということは、果たして良いことなのだろうか、という疑問もある。期待というのはある種のこだわりの表れであるし、こだわりというはその人が伝えたいことであるわけだから、重要な事柄なはずだ。自分がこだわっている事柄を相手に理解してほしいからこそ期待するのだろうし、その結果として伝わらないことに憤りを覚えることになる。

なぜ今回、2015年のエントリの続きを書こうと思ったのかと言うとPodcastTuring Complete FM」の30回の最後で、まさにこの話が議論されていたからだ。

Rui「思うんですけど、教えるときに厳しすぎる人が多いなというイメージがあり、自信を失わせる方向で教えるのではなく、自信を増やす方向で教えるほうがいいんじゃなかなって」

hikarium「自信を失わせるのは本当に良くない。最初にできないのは悪いことじゃないですもんね。」

Rui「できないから逆にいるわけですからね。」

hikarium「できるんだったら来なくてよいので。だから、できるようになっていこうとしている人には本当に優しく接してあげるというか。当たり前のことですけど。」

Rui「hikarium とかちょっと厳しいときもありましたよ。」

hikarium「すみませんでした。たまになんか、てか、結構言われるんですよ。hikariumはスパルタだからって、たまに言われるんですよ。」

Rui「別にそんなつもりはないんでしょう?」

hikarium「あ、いや、ちょっとスパルタっぽくしているときはあります。でも、それは意図したものです。」

Rui「じゃあ、それをやめればいいんじゃないですか。それを。」

hikarium「でも、今回は……今回もちょっと駄目でした?」

Rui「僕はhikariumを知っているから、hikariumなみに優しくしているのかな、と。」

hikarium「いや、難しいですよね。」

Rui「まぁ、でも、それは、それこそ訓練じゃないですか。教え方と言うかテクニックがあり。心構えというよりはむしろテクニックですから。」

hikarium「あーなんか、自分が教えているのは、できそうな人を教えているので。だから、ちょっと期待値を高めに投げているので。それがちょっとスパルタっぽく見えるのかなっていうのがあるかもですね。外から見ると。」

Rui「別に期待しなければいいんじゃないですか。それはなんか言い方の問題だけど。別にこれくらい教えたんだから、これくらいできるだろう、と思わなければいいんじゃないですか。」

hikarium「たしかに、それもあるかも。せっかくだからいろいろやってほしいじゃないですか。まぁ、そうですね。高い目標を立てるというよりは、少しずつできる目標を立てて、それができたらすごいっていうことを言ってあげて自己肯定感を高めてあげるのは本当に大事なことかなと思います。」

Rui「本人が目標を立ててそれを達成するのはいいですけど、別にこっちがそれを期待する必要はないですからね。これくらい教えたから、これくらいできるはずなのに、なんでできないんだ、と思っても仕方ないから。」

hikarium「なんでできないんだという思考が一番危ない。」

私も歳をとったからかもしれないけれど、今となっては Rui さんの言うことがよくわかるし、若いときには hikarium さんに近い気持ちを持っていたな、と感じる。

一般化できるものなのかはわからないけれど、年齢と共にある種の尖った部分は減ってくるものだとは思う。若い頃には自分の考えは他の人にも理解できるものだ、という誤解があるけれども、多くの経験をする中で、世の中にはいろいろな人がいて、いろいろな考えを持っていて、そして必ずしも自分の考えが正しいとも限らない、ということがだんだんとわかってくる。そして、期待をするという概念自体、実はどうでもいいことなのではないかということに気付いてくる。

結局のところ、教育の結果などというものは教えられた当人次第なのであって、教える側がどうこうできるものではない。ようは「馬を水辺に導く事はできるが馬に水を飲ませる事はできない」ということだ。教える、ということは教えられた当人に伸びる”きっかけ”を与えるに過ぎない。そういう意味で期待をすること自体、余計なことなのかもしれない。

Python StatsModels メモ

R と比較すると微妙にサポートされていない機能があって困ることが多い StatsModels ですが、Python に寄せていきたいので、できるだけ使ってみてます。

ライブラリのロード

import statsmodels.api as sm

# R互換の関数方式を使う場合はこっち
import statsmodels.formula.api as smf

データの準備

データのロード

import pandas as pd
data = pd.read_csv('data.csv')
# TSVは、data = pd.read_csv('data.tsv', delimiter='\t')
data = data.fillna(0) # 欠損値がある場合は 0 で埋める

関数を使ったデータの生成

data = pd.DataFrame([dict(
    n= i, 
    v= i**2,
) for i in range(5, 10)])

データのサイズ

data.shape[0] # 行数
data.shape[1] # 列数

歪度、尖度

data.x.skew() # 歪度
data.x.kurt() # 尖度

モデルの定義

単回帰

model = sm.OLS(data.y, data.x)
#  あるいは、 model = smf.ols('y ~ x', data)
results = model.fit()
results.summary()

単回帰(切片なし)

model = sm.OLS(data.y, data.x)
#  あるいは、 model = smf.ols('y ~ x - 1', data)
results = model.fit()
results.summary()

単回帰(対数変換)

import numpy as np
model = smf.ols('np.log(y) ~ np.log(x) - 1)', data)
results = model.fit()
results.summary()

単回帰(不均一分散)

model = sm.OLS(data.y, data.x)
#  あるいは、 model = smf.ols('y ~ x - 1', data)
results = model.fit(cov_type = "HC0") 
results.summary()

通常、単回帰分析では分散が均一であるという仮定がある。cov_type で分散が不均一でもロバストに処理できるオプションが設定できる。指定は HC0~HC3 まであるが、数字の小さい方が保守的、大きい方が小規模データ向きとなる。

重回帰

model = sm.OLS(data.y, sm.add_constant(data[ ['x1', 'x2', 'x3'] ]))
#  あるいは、 model = smf.ols('y ~ x1 + x2 + x3', data)
results = model.fit()
results.summary()

加重線形回帰

model = sm.WLM(data.y, sm.add_constant(data.x), weights=1.0 / (data.w ** 2))
#  あるいは、 model = smf.wlm('y ~ x', data, weights=1.0 / (data.w ** 2))
results = model.fit()
results.summary()

ロバスト回帰

model = sm.RLM(data.y, sm.add_constant(data.x))
#  あるいは、 model = smf.rlm('y ~ x', data)
results = model.fit()
results.summary()

分位点回帰

from statsmodels.regression.quantile_regression import QuantReg
model = QuantReg(data.y, sm.add_constant(data.x))
#  あるいは、 model = smf.quantreg('y ~ x', data)
results = model.fit(q = 0.5) # 50%分位点
results.summary()

リッジ回帰、ラッソ回帰、Elastic Net

model = sm.OLS(data.y, sm.add_constant(data.x))
results = model.fit_regularized(L1_wt=0) # L1_wt が 0 の時 リッジ、1の時ラッソ、その間が Elastic Net
results.params

OLSと同じだが、fit の代わりに fit_regularized を使う。ただ、fit_regularized だと、なぜか summary() が None を返すので、params の値を参照する必要がある。

一般化線形モデル (GLM)

model = sm.GLM(data.y, data.x, family=sm.families.Gamma())
#  あるいは、 model = smf.glm('y ~ x', data, family=sm.families.Gamma())
results = model.fit()
results.summary()

一般化線形混合モデル (GLMM)

model = sm.MixedLM(data.y, sm.add_constant(data.x), groups=data.g)
#  あるいは、 model = smf.mixedlm('y ~ x', data, groups=data.g)
results = model.fit()
results.summary()

グラフの表示

import matplotlib.pyplot as plt
plt.scatter(data.x, data.y) # 散布図
plt.plot(range(int(data.x.min()), int(data.x.max())), results.predict(range(int(data.x.min()), int(data.x.max())))) # 折れ線グラフ

# 図表をクリアする
plt.clf()

結果の各値の取得

results.params["x"] # 係数
results.pvalues # p値

VIF値の計算

from statsmodels.tools.tools import add_constant
# VIF の算出には定数が必要となる
data2 = add_constant(data)
pd.DataFrame([dict(
    name = data2.columns[i], 
    vif= variance_inflation_factor(data2.values, i)
) for i in range(data2.shape[1])])

「グラフをつくる前に読む本」が名著だった話

最近、Twitter 経由でおすすめされている本を買うことが多いんだけど、これもその中の一冊。

装丁とタイトルだけ読むとグラフの書き方を図解で学ぶハウツー系の軽い本のように思えるけど、予想をいい意味で裏切る良書だった。似たような資料としてマッキンゼーのスタイルガイドがあるけれど、こっちの方は基本というより応用編的な難易度でなかなか使いにくく感じていたので、この本のシンプルさには感銘を受ける。

何がいいかと言えば、各グラフの説明だけでなく、そのグラフが生まれた歴史までがきっちり調べて書かれているところ。てっきり、いろいろなところで生まれたグラフ概念が洗練されて今の形になったのだと想像していたのだけど、現在使われているグラフのほとんどが1786年に発行されたウィリアム・プレイウェア著「The Commercial and Political Atlas」を起源とするというのには驚かされる。なんて有能な人なんだ。

とはいえ、このプレイウェア氏、様々な事業に挑戦したものの失敗し、詐欺、恐喝、名誉毀損と犯罪尽くめの晩年だった挙げ句、グラフの生みの親として評価されたのは19世紀以降と残念な人生だったようで。世の中うまくいかないものですなぁ。

もちろん、この本の良いところは歴史や用語の定義などきっちりバックグラウンドを書いているところだけではない。グラフの使い方について次のようなわかりやすい指針を示しているのは大変実用的だと思う。しかもこの内容を惜しげもなく本の最初にもってきてるは理解を容易にする意味でとても良い。

得意な表現方法 個別 全体
実数 割合
データ間の比較 棒グラフ レーダーチャート 円グラフ
積み上げ棒グラフ
時間の経過による推移 折れ線グラフ 面グラフ
データの偏り ヒートマップ
データ項目同士の関係 散布図

そうそう、これが知りたかったんですよ。*1

円グラフは使ってはいけない、という主張も説得的。なるほど、今後は円グラフでてきたら眉につばを付けて見るようにしよう、という気になる一冊。

*1:本書内での主張とグラフの配置が微妙に違っていたので一部修正しました

映画「ウィンストン・チャーチル」がよくわからない映画だった件

先日、映画「ウィンストン・チャーチル/ヒトラーから世界を救った男」を見てきた。

特殊メイクで話題の本作だが、たしかにそこはすごい。あらかじめわかっていても、とうていゲイリー・オールドマンが演じているようには見えない。ものすごく自然に見える。

とはいえ、特殊メイクが自然な分、見ている分には凄さがわからない。では映画の方はどうだったか。私には問題含みに感じられた。

一番の問題はテーマだ。

おおまかなストーリーはこうだ。徹底抗戦を主張していたチャーチルは戦時内閣の首相として任命される。不利な戦局に直面し政敵からの和平交渉提案に頭を悩ますが、最終的には市井の市民のくじけない意思を汲み取り徹底抗戦の道を選び、全政党の支持を取り付ける。そのまま普通に捉えれば、「信念を貫く素晴らしさ」が主題として選ばれているように思える。

しかし、だ。もしこれが太平洋戦争時の日本の立場ならどうだろうか。

不利な戦局に直面した大日本帝国の首相は、天皇陛下などからの和平交渉提案に頭を悩ますが、最終的には民衆の熱狂に煽られ、一億玉砕の道を選ぶことになる。素晴らしいどころか悲劇でしかない。大衆というものは、敵に面した時、戦争には熱狂的に賛同するのが普通であり、民意を聞いて徹底抗戦などというのは最低の決断と言っていい。

実際、イギリスにしてもアメリカが参戦しなければ厳しい状況が続いていたと考えられ、徹底抗戦の成功は結果論に過ぎなかったかもしれない。

そして、政敵であるハリファックス側に視点を移せば、彼もまた平和主義に基づく信念を貫いていることには違いなく、そのことを考えれば、チャーチルは素晴らしく、ハリファックスはダメという結論は一面的に思える。

しかも、史実を調べてみるとチャーチルは信念を貫いたわけではなく、「和平交渉が可能ならば飲むつもりだった」が、イギリスが不利な戦局だったため現実的には不可能だった、ということのようだ。

わざわざ史実を捻じ曲げてまで、なぜチャーチルを大衆に煽られた変人として描く必要があったのか。チャーチルの評価はそんなところにはないのではなかろうか。この映画が何を描きたかったのかさっぱりわからない。

映画は本来一番の見所になるはずのバトル・オブ・ブリテン前に終わってしまう。チャーチルはこの後、ロンドン市街をおとりにしてバトル・オブ・ブリテンに勝利し、ナチス・ドイツに対する突破口を開くという快挙を成し遂げるが、この映画での着地点はイギリス国民からの信任を得るところまでとなっている。このこと自体は歴史的快挙でもなんでもないだろう。

個人的には、チャーチルの信念ではなく、老獪で冷徹な思考でもって難局を切り抜けていく姿をこそ見たかったのだけれども。

「確率統計-機械学習その前に v2.0」を公開した

以前、社内の勉強会用の資料として作成した「確率統計-機械学習その前に」という資料を今回大幅に改定して公開しました。

改定の一番のポイントは、統計分析の総覧的なガイドとして使えるようにしたことです。正直な話、内容的に私自身も十分に理解出来ていない部分も多いのですが、いろいろ調べた結果、なんとなく統計分析の手法マップ的なものが頭の中に出来上がってきたので、それをアウトプットとしてまとめてみました。

 
確率統計に限った話ではありませんが、新しい分野を学ぶ初学者にとって、全体像がよくわからないため混乱することが少なくありません。この資料を読むことでなんとなくでも全体を把握できていれば、他の文献を読む際にも理解が容易になるのではと思っています。
 
例によって、確率統計については完全に素人なので、間違いもあるかもしれません。その場合はそっと教えてもらえると幸いです。最近 SlideShare は再アップロードが廃止され、直接修正が難しいところもありますが、何らかの形で訂正できればと思います。
 
資料化したことで個人的にも気づきがありました。
 
昨今、とりあえずなんでも機械学習に入れてしまえという風潮が目立ちますが、原因を分析し意思決定する場合には、機械学習非線形回帰はさほど役に立たず、確率統計こそが必要なのだ、ということがようやく理解できたような気がします。
 
その意味で、昨今ベイズ推定の本が増えているのは当然の流れなのかもしれません。頻度主義確率に基づく統計分析は理解も解釈も難しいのに対し、ベイズ推定による統計分析は(覚えるまでは大変ですが)結果の解釈も含め直観的で使い勝手のよいツールに感じられます。
 
そろそろ機械学習ブームが沈静化しつつありますが、次はベイズ推定ブームが来るのでは? などと勝手に想像しています。さて、どんなもんでしょう。
 

アニメ「未来日記」が面白かった話

若い頃は、と書くと年寄りじみてしまうけど、もうすぐ初老だ。悲しいかな、人間特に何もしていないのに歳だけはとっていく。押井守は「若さに価値などない」という。今に至り、それは概ね真理だとは思うけれど、そうとも言い切れない部分もある。ひとつは(本当にはないのかもしれない)可能性を夢見る能力、もうひとつは残り時間が長い分長期投資ができることだ。

歳をとったからこそわかることというのは多い。若い頃は、自分の面白いと思うものは誰もが面白いと思うものだと思っていた。大学くらいでその違いに気づき始めるが、その違いは話せば埋めることができるものだと思い込んでいた。そしてそのうち、世の中には想像を遥かに超えるいろんな考えの人がいることに気付いていく。

同じ職場にいて、同じように仕事をしていても、それぞれの生まれや性格、人生や立場があり、価値観は意外なほど異なっている。話せばわかりあえる、などというのはたまたま議論の参加者に共通点があったからかもしれないし、実際には噛み合っているようにみえただけで、各人の脳内に浮かぶものはまったく別なのかもしれない。

閑話休題Netflix でアニメ「未来日記」を見たところ、大変おもしろかった。以前からところどころで言及されるので気にはなっていた。

少し前の作品だからか、あまり言及を見ないけれど「未来日記」はいろいろと新しいアイデアが詰まっている。「未来日記」というガジェット自体、よくある特殊能力系のひとつとも言えるが、その能力の理由付けに合理性があり、携帯だけでなくボイスレコーダーや絵日記、巻物といったメディアの多様性もある。すごく良く出来たアイデアだ。

一番の発明は、「気の狂った殺人鬼かつストーカーだが、一途に愛してくれる」という異常なヒロイン像だ。好きが転じて殺人、というパターンはあったが、こんなキャラクターが成立するとは。

面白いと思うところは人それぞれだろうけど、見ていると自分が「新しい発想が好き」であることに気付かされた。具体的に書くとネタバレになるものが多いから書かないけれど、SFっぽいファンタジーが好きなのもそれに起因している気がする。

後半に行くに連れて斬新さは減ってくるけれども、最初から全力で話が展開していくので、まったく飽きることなく最終話までいっきに見てしまった。

良い悪いということではないけれど、普通の作品だったら、第一話はもっと日常風景を描写したり、主人公が妄想に浸る様子を見せて、その後の展開で驚かせるものだと思う。しかし、そういうまどろっこしい演出は一切ない。そういえば、作中では連続殺人、学校爆破でクラスメート殺戮、タワー破壊と、そうとう陰惨な出来事が起こっているにも関わらず、押しなべてあっさりした演出となっている。悲劇に躊躇も感情もない。

総じて、この作者の考えが私の思考の延長線上にまったくない。

どのキャラクターも狂人の類でまったく感情移入できないし、こんな陰惨な事件をサスペンス・アクションとして書くなどということはできそうもない。私にはストーリーテラーとしての才能はないが、もし書けたとしても常識の範囲内の人間像で造形し、陰惨な事件は陰惨な演出にしてしまうだろう。

「お前は俺か」と思うような作品も楽しいけれど、こういう自分の中にはまったくない思考を垣間見れる作品は本当に貴重に思える。

「話せばわかる」と言って殺された犬養毅の没年は 76 歳だそうだ。歳をとったからと言って必ず気付くものでもないらしい。たしかに気付かない方が人生は幸せそうではあるが。