suztomoの日記

To be a good software engineer

How to Retire with Enough Money

How to Retire with Enough Money - and how to know what enough is の読書メモ。図書館で借りれた。

 

アメリカ人は老後のための蓄えが十分ではない。昔はtraditional pensionというのがあり、企業は給料の一部を取り引退した人に総額が固定されたリターン(fixed-sum benefit)を渡していた。もし運用ファンドが損を出したら企業はそれを補填しなければならなかった。このtraditional pensionは企業は必ずやらなければいけないものだった。しかし、ごく一部のお金持ち向けの税理士が税制に穴があることを見つけた。その節は401(k)。そこからその仕組みを利用して多くの従業員が401kを利用するようになった。企業としては401kの方が安上がりなのでdefined-benefit planなtraditional pensionよりもdefined-contribution planな401kを勧めるようになった。引退後の資金が企業の責任から個人の責任へと変化しており、アメリカ人はその備えが足りない。

 

401kは完璧ではないが、老後の蓄えの鍵である。税金がかからないし、企業もお金をくれる。家が欲しくても切り崩してはならない。手数料の安いインデックスファンドを買おう。

 

十分な貯蓄とは何か。それは予測される余命による。遺伝子や健康状態に左右される。特に問題なければ人は80歳以上になるだろう。

 

例えば67歳で年収$75k (pre tax)の人が引退するとする。35% ($26.25k) from Social Security. その人は引退したら前の70%に抑えて生活するので$52.5k年間必要。Social Securityでは半分だけである。$26.25k足りない分は貯蓄から崩すが利子(5.25%)を引き出して生活するには$500k必要である。利子は3-5%なのでこれは楽観的なほう。

 

借金は早く返そう。Tax breakがあるかもしれないが、計算すれば借金を早く返した方が得だろう。

 

Social SecurityとMedicareはとても効率的で良い仕組みなのだが、それだけでは十分ではない。十分ではないということを材料に一部のダメな政治家は削ろうとする。それらの仕組みを支える政治家に投票することが有権者として重要だ。

Houston, we have a narrative

邦題"なぜ科学はストーリーを必要としているのか──ハリウッドに学んだ伝える技術"の読書メモ。人間は何千年も前から特定の物語の型(ABT)を受け入れやすく作られている。筆者はハリウッド映画の世界でそれを学ぶ。科学者はその型を受け入れてコミュニュケーションするべきたと説く。


Most people take their talks personalだが、人間の脳は理解しやすい話の形式があり、それはABT(ANDs, BUT, Therefore)という型である。

事実を曲げる訳ではない

科学者はStorytellingと聞いて事実を歪曲して伝えるものではと身構えるが、そうではなく、Storytellingとは事実を他者に理解しやすい形で伝える方法のことである。

Power of one

 大きすぎる数は忘れられる。1つの具体的なエピソードは強い印象を与える。これは前の経済学の本にも書かれていた。

Economics for the Common Good - suztomoの日記

Narrative

そもそもストーリーとは何か?について次の説明が書かれている。

Narratives are stories that connect a series of events over time, creating large-scale patterns.
A narrative, or a story, is a series of events that happen.along the way in the search for a solution to a problem. p.182 

 

Hollywood

理系が駄目ならば人文学はどうかというとここも問題がある。なので筆者はハリウッドの世界へ足を踏み入れた。ハリウッドは弱肉強食の世界で自分のストーリーが理解されなければ直ぐに生きていけなくなる(3章) 

Word, Sentence, and Paragraph

この3つの型(テンプレート)がある

Word

もっとも重要な言葉は何か。

Nothing in X makes sense except in the light of Y.

Without Y, there's no meaningful picture as a whole. 

Sentence

AAA (boring)

ABT (optimal), and-but-thereforeの形

DHY (complex. too many direction)

Relatable 

会話ではRelatabilityが高い話から始めると聞き手に興味を持ってもらいやすい。 

Papagpaph

これは難しいので本ではReferencesの紹介に留めている。


試みが失敗しそうな時がストーリーの中には常にある。

Economics for the Common Good

読書メモ。環境問題から格差社会までさまざまなトピックについて著者が紹介している本。とくにゲーム理論をはじめとしてIncentiveにまつわる話が多い。

経済学者と癌専門医との似ている部分は、今にある限りの情報を使ってもっとも有効であろうと思われる「治療法」を勧めることである。ある限りの情報から問題を分析するという点はソフトウェアエンジニアに似ていると思ったが、「勧める」という部分がポイントでいかに経済学者が博識であろうとも実際の政策は経済学の素人の政治家や役人が決めるところに著者の主張するジレンマがある。プログラマは自分たちで問題を対処することが多い。

Daniel Kahnemanによる研究で人間の記憶や印象は間違って残るという。2001年の同時多発テロから殺人で20万人もが殺されているが、そのうちイスラム教徒によるテロリストは50人だけである。しかし、人々の頭ではテロリストが殺人の原因であるという印象が強い。顔が見える被害者へのバイアスは強い。「一人の死は悲劇であるが、100万人の死は統計である」というのはJoseph Stalinの言葉。

公共の資源を適切に民間に配分するするにはどうすればいいだろうか。やる気や公益は測ることができない。アメリカでは、もっとも多く払う会社に電波を提供する電波オークションという仕組みを経済学者がデザインして、政府に税収をもたらした。

経済学の本には3種類ある。Greek-letterは難しい学者向けの経済学の本、Up-and-downは株価や経済指標が上がった下がったという話を述べる本、そしてairport本は飛行場の本や売っているような一般人向けベストセラーになるような本。

Moralの対立に陥ってはいけない。Moralは時代によって変わるものである。より正しいアプローチは質問を重ねることである。「被害者は誰か」「そう考える原因は何か」「他者の権利を侵害するに足る理由はあるのか」。臓器移植、代理母、売春など様々な規制があり、それらの論拠を知ることは政策立案の背景を知れる。

温暖化ガス排出量規制は特定の国だけでは効果が薄い。交渉可能な排出量規制を導入したことで各国での政策立案のコストを大幅に減少することに成功した。

新たなインセンティブを導入することで期待したのと逆の効果が現れる時がある。例えば献血した人に対価を払うという実験をしてみたところ、献血にいくことが小銭稼ぎに見えたせいで、これまで善意で参加していた協力者が減ったということもある。

"Veil of Ignorance"というのはどのような社会が望ましいかを考える際に自分のついている属性(人種、性別、土地)を全てとりはらって考えるという思考法である。車が道路にいる5人の人に向かっている。車を脇道にそらせば運転手が死に、脇道に逸らさなければ5人が死ぬ。Veil of Ignoranceの下では自分が5人側にいるか運転手側にいるかはわからないので車を脇道に逸らすという選択をするが、実際に自動運転の車を買おうとしている場合では異なる結論になるだろう。

グローバル化、貿易自由化は輸出ができる会社には利益になるが、輸入したものと競争をしないといけない会社・産業を弱める。

格差が広がっている。PikettyのCapital in the Twenty-First Centuryが有名。(労働による収入の増加よりも資本から生まれる収入の増加が大きい。なので格差は広がる一方である。)Aghionによると、価値創造をして生まれる利益と既存の資本を貸すことにより生まれる収入(rents)とを区別する必要がある。不動産価格の上昇によって得られた富は社会に価値を創造していない。

アメリカの大学が世界ランキングで上位にある。これはまず大学内のポストが能力主義によるところと、世界中から優秀な学生や先生が集まってくるからである。

なぜ経済学者は数学を使うのか。それは我々が完璧ではない(not smart enough)からであり、数学は理論の穴を見つけるのに役にたつ。プログラミング言語型理論に似ている。

カルテルを防ぐルールは、ゲーム理論に基づいている。例えば、カルテルのメンバーがカルテルを当局に通報することにより罪状がなくなる。

ゲーム理論の発達により契約はお互いが秘密にしている情報があることを前提に書かれる様になった。観測・計測できる要素が契約に含まれるようになった。

郵送で投票できるようにすれば投票率は上がるか。一見上がるのが自然だが、小さなコミュニティでは投票所にいくということが良識を確認し合う意味を持っている場合があり、そのような場合では投票所にいかなくても投票権を行使できるということは投票率が下がる要因になった。

人間が自分自身に嘘を吐く(都合のいい事実だけを信じる)のはなぜか。それは1. 意思の弱さ恐れるから、2. 喜びや悲しみを実際に経験する前に感じるから、3. 人々は自分に対する理想的なイメージを保持したいから。特に2は事故や死などを頭の外においておくことができる。幸せな暮らしを送れる反面、シートベルトを忘れるといったことがおこる。

人口の中で「内部」、「外部」に分かれてしまうと、外部とされる者の中には社会との繋がりが薄れ、治安の悪化、ゲットー、過激派に転向してしまう者もでてくる。社会全体として望ましくない結果となる。

前に書いた通り経済学者は勧めるだけであって、それを決定するのは往々にして選挙で選ばれる政治家である。政治家も人々と同じ様にIncentiveによって動く。政治家のIncentiveとは次の選挙で選ばれることであるから、政治家が正しい判断をするためには有権者が正しい知識を身につける必要がある。例えばスペインの不動産バブルは早くから経済学者から警鐘を鳴らされていたが、政治家は不動産価格上昇を止めてしまうと有権者から目をつけられてしまうために対策を怠った。

Corporate social responsibility and social responsible investment. 企業は2つの原理から成っている。価値の創造と義務(accountability)である。ここでAccountabilityとは企業と取引している人だけでなく、企業の活動によって不利益を被りうる人(stakeholders)への説明責任である。工場の近隣住民(彼らは意思決定に携われない)と工場による公害の予防が良い例。また企業によるリストラによって発生する雇用保険の費用も例に挙げられている。 European Commissionによると企業の社会的責任とは、関係者(stakeholders)との対話と日々の企業活動に、社会的な環境の問題を自発的に組み入れることである。CSRは法によって定められるものではなく、社会全体として見た時に行うべき行為を企業が自発的に取り組むものである。A sustainable view of the enterprise. 長期的に見て行う投資(SRI)。Delegated Philanthropy. フェアトレードで取引された豆を使うコーヒー屋は、そのためなら少しコーヒーが高くなっても問題ないと思う客の需要を表している(代弁している/delegated)。Corporate Philanthropy. 会社が正しいと思うことに利益が減ることになったとしても取り組む。

フランスの雇用規制改革。フランスでは正社員と非正規社員の差が激しい。この雇用規制によって会社と人材とのマッチングが上手く働かないので新しい会社・雇用が生まれていない。リストラにあった数百人の社員の顔や見えるが、この雇用規制によって失われている雇用につきうる何万人の顔は見えない。今の雇用契約は保持したまま、新しい雇用契約はよりフレキシブルにすることで既得権益の人にも理解がされるのではないか。

Agency problem。個別の人間が合理的な判断をしても社会全体として不利益が生まれること。リーマンショックが起きる直前にあの会社は問題をわかっていながらよりリスクを取った。リーマンの人間からすれば何もしなければ会社が潰れ個人としては失うものはなく、リスクを取れば(もしくはアメリカ政府が救済すれば)生き残り利益を得られるかもしれないからである。

Two-sided platform. 供給者と利用者を繋げるプラットフォームビジネスが流行っている。GoogleFacebookは広告、AppleはAppStore、AmazonはEコマース、SonyはPlay Station。Sonyプレイステーション本体を売っただけでは損をするが、これはゲーム開発会社を取り込むための作戦。ゲームが売れれば開発会社はSonyにライセンス料を払う。

Patent Pool. 特許をまとめて売ったり一緒に販売すると利用者からは便利。

経済学の分野というものは「物事には一長一短ある」と唱えるものだと考えている人々が多い。これでは政策立案には経済学は使えない。しかし、実際には多くの事柄において共通認識があることを我々経済学者は表明するべきだ。

RustでConvolutional Neural Network

趣味プログラミングとしてRustとNeural Networkを勉強したかったので、ゼロから作るDeep Learningを読んでRustでChapter 7のConvolutional Neural Networkを実装した。

www.oreilly.co.jp

実装したコード: Language Study/Rust - conv_nn_mnist

Rust

プログラミング言語Rustがこれからより多くの場所に使われるだろう。コンパイラが間違った(間違いそうな)コードを弾いてくれる点と、クロージャや台数データ型といったプログラミングの抽象化がスピードを犠牲にせずに利用できるという点はとても魅力的である。

一方でRustは難しい。書いたコードはだいたいコンパイラエラーに当たる。Structや関数のsignatureに対してRustのコンパイラがエラーを出した場合、メッセージをしっかり理解してその部分を直すことでよりデータの所有権や参照のlifetimeが明瞭な安全なプログラムを書くことができる。

プログラミング言語研究の成果を享受できるのでRustは好きだ。

開発環境

VSCode。良くできてる。lldbのプラグインGUIを使ったデバッグもできる。

エラーメッセージ

Rustのエラーメッセージは時々難しい。例えば、weightsという行列の各要素からself.mの各要素を少し変形したものを引くという

        *weights -= (&self.m * lr_t / &self.v.mapv(|v| v.sqrt() + 1e-7));

このコードに対して、下のエラー。

error[E0271]: type mismatch resolving `<ndarray::OwnedRepr<f64> as ndarray::Data>::Elem == ndarray::ArrayBase<ndarray::OwnedRepr<f64>, D>`
  --> src/network.rs:66:18                                                                                                               
   |                                                                                                                                     
66 |         *weights -= (&self.m * lr_t / &self.v.mapv(|v| v.sqrt() + 1e-7));                                                           
   |                  ^^ expected f64, found struct `ndarray::ArrayBase`                                                                 
   |                                                                                                                                     
   = note: expected type `f64`                                                                                                           
              found type `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, D>`                                                                
   = note: required because of the requirements on the impl of `std::ops::SubAssign` for `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, D>`
                                                                                                                                         
error[E0277]: the trait bound `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, D>: ndarray::ScalarOperand` is not satisfied                  
  --> src/network.rs:66:18                                                                                                               
   |                                                                                                                                     
66 |         *weights -= (&self.m * lr_t / &self.v.mapv(|v| v.sqrt() + 1e-7));                                                           
   |                  ^^ the trait `ndarray::ScalarOperand` is not implemented for `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, D>`

そのまま読めばArrayBase<ndarray::OwnedRepr, D>という型がScalarOperandというtraitに合っていないということ。だからといって加減剰余の演算をArrayBaseに対して行えないばけではない。実はこのエラーは"-="はbinary operationの右辺は行列ではなく行列への参照じゃないといけない。ndarrayのドキュメントにそう書いてある

docs.rs

これを読めば、&を右辺の最初につければいいんだなとわかるのだが、RustコンパイラはこのドキュメントへのURLを表示することはできない。

クロージャのTrait

FnやFnMutのエラーメッセージも難しい。Rustのかわいい蟹の本のMulti-threaded web serverの章にもクロージャにまつわる難解なエラーメッセージの話があるように、Rustコンパイラは完璧ではない。Rustがより良くなっていってこのあたりが簡単になりますように。

ndarray

行列ライブラリにはRustのndarray - Rustを使った。

why are there so many linear algebra crates? Which one is "best"?の中でndarrayの評判がよかったので。

dotと*

Array.dot行列の掛け算で、*がelement-wise operation。行列の掛け算は1次元の行列と2次元の行列とで振る舞いが異なる。

into_shape()

ハマったところはinto_shape()。まずinto_shapeが使えない場合があるので自分でreshape関数を作ったが、これは常に行列をコピーすることになって失敗しない代わりにメモリが無駄になっているはず。

次にpermuted_axis()into_shape()は混ぜて使えないところ。このlimitationは最後の最後まで気づかなかった。

Resolve into_shape() limitations · Issue #390 · rust-ndarray/ndarray · GitHub

slice_mut

これは便利

    for y in 0..filter_height {
        let y_max = min(y + stride * out_h, input_padded_height);
        for x in 0..filter_width {
            let x_max = min(x + stride * out_w, input_padded_width);
            ...
            let img_slice = img.slice(s![.., .., y..y_max;stride, x..x_max;stride]);
            let mut col_slice_mut = col.slice_mut(s![.., .., y, x, .., ..]);
            col_slice_mut.assign(&img_slice);
        }
Layerの型

最初はニューラルネットワークの層を表すtraitを作ろうとして挫折した。これは層を1つ1つ実装していく中で層の中には4次元の入力を受けるものと2次元の入力を受けるものがあるからだった。今考えると入力の次元数と出力の次元数でgenericsを使ったtraitを作れる気がする。Layer<Input, Output> where Input: Dimension, Output: Dimension みたいな。

ところで、Numpyでは下のコードの様に異なる入力の型をとるlayerをまとめてリストに入れたり、その入力と出力をforループで回したりできる。

    def predict(self, x):
        for layer in self.layers.values():
            x = layer.forward(x)
        return x

しかしRustは型に厳密なので、これができない。一応ndarrayにはdynamic dimensional arrayはあるが型安全性は失われてしまう。これを解決してくれる良いデータ型はないものだろうか。例えばこんなの

Network [ Layer<Ix4, Ix4>, Layer<Ix4, Ix2>, Layer<Ix2, Ix2> ]   # => compiles
Network [ Layer<Ix4, Ix4>, Layer<Ix4, Ix4>, Layer<Ix2, Ix2> ]   # => error becauase the second output and the third input are different
絵が書けない

PythonとNumpyの組み合わせに比べるとこのRustでの実装ではグラフ描画やipythonのようなインタラクティブな操作ができない。入力データの画像を目でも見たかったのでansi_termで色をつけて表示してみたりした。

MNIST number 7 shown in terminal
MNIST 7 in ansi_term

Convolutional Neural Network

ニューラルネットワークを計算グラフとして考えることで、損失関数の重さに関する偏微分の計算が局所的になるところがミソ。なのでネットワークにいくつもの層があっても、各層ごとに重さと入力の各要素の偏微分が(局所的に)合っていれば全体の計算が合う。ネットワークが期待通りに動かなかった時にどこの計算の実装が間違っているのか調べるのは骨が折れる作業だが、Gradient checkを使うと実装が怪しい層を見つけることができる。自分の場合はどうしてもバグの箇所がわからない時があったので、結局上の本のgithubにあるNumpyの実装に同じ値を与えてどこの変換でバグがあるのか調べた。(結局上のpermuted_axis+into_shapeが原因だった)

本のChapter 7のSimple Convnetの構成はconvolution layer -> relu layer -> pooling layer -> affine layer -> relu layer -> affine layer -> relu layer 。損失関数はsoftmaxとクロスエントロピー誤差。入力はMNISTの28x28のグレイスケール画像データ。層を何枚も重ねる「ディープラーニング」はしなかった。

Convolution Layer

は入力画像の一部に適用される重み(filter)を何層も持つことでAffine layerだけのネットワークよりも画像の一部の形に反応するネットワークを作ることができるらしい。

Adam

Adamはネットワーク内部の重みを調節するアルゴリズムの一つ。これを導入する前は重みから偏微分されたものをlearning rate 0.01掛けて引いており学習の結果は悪かった(テストデータに対して40%とかの確率)。Adamを導入したら同じ回数の学習で97%を達成。

RustとConvolutional Neural Networkを学べたので目標達成。

やらなかったこと

世界のエリートはなぜ「美意識」を鍛えるのか?~経営における「アート」と「サイエンス」

読書メモ。

世の中のエリートが美術館や美術の大学院に通いはじめている理由はなにか。これはMBAコンサルティング会社で学ぶ知識がコモディティ化されてしまった今、ビジネスで差別化を図るならば人々の感覚に訴えるセンスが必要だからである。フェイスブックやインスタグラムの成功は科学では説明できない部分も多い。

このセンスやアートは科学ではっきり説明できるものではなく、また科学との対立軸に立たされると(論理的には)勝てない。組織をつくるときにはアートや哲学のセンスをもつ人をトップに据え、「科学」に強い部下を持たせると良い。

禅や日本庭園に見られる日本の美意識は欧米からみると(なんとなく)特別であると見られており、この時代はそれを生かすチャンスである。マツダ自動車の復活はその良い例である。もしかしたら、この時期を逃すとこの特別感は失われてしまうかもしれない。

Management 3.0

本のメモ

 

1.0 Command-and-control

これは同じことの繰り返しをするような仕事の時は機能したけれども、クリエイティブな仕事を要求するものでは通用しなくなった。確かにプログラマがやってる仕事は人月の神話にあるように1人が何時間かければ解けるようなものではない。

 

Management 2.0

1.0がダメなので次を人々は試した。"Balanced Scorecard”, “Six Sigma”, “Theory of Constraints”, “Total Quality Management”などなどを偉い人向けにアドオンとして考えた。

けれども根本的な階層構造を持つ組織はそのままであった。

 

Management 3.0

Complexity. 物事は思った通りには進まない。会社は階層構造ではなく人々のネットワークである。リーダーシップは偉い人だけのものではないし、それが不要というものでもない。Pragmatic(実利的)なリーダーシップが必要。

 

 

Empower teams

 

Develop competence

 

Align constraints

 

Energize people

extrinsic motivation (Theory X)は給与や賞賛。これに対して intrinsic motivation(Theory Y)はself-control, self-eagerness, and self-directionが重要。クリエイティブになる。

 

Improve everything

 

Grow structure