suztomoの日記

To be a good software engineer

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

 

 

 

Negotiation

Harvard Business Press.

 

2つのタイプ

Distributive negotiation. ゼロサムゲーム。片方の得は相手の損になる秘密にした方がいい。良いBATNAがあることは話しても良い。

Integrative negotiation. お互いでパイを大きくしてから分け前を取るもの。相手の立場も考えて長い付き合いになることも考えてやる。

 

BATNA (better alternative to non agreement). もし取引成立しなければどういうオプションがあるのか。”Speak softly but carry a big stick” by Theodore Roosevelt.

Reservation Price.

ZOPA: zone of possible agreement.

 

意思決定できるか。お互い意思決定できるならば情報の行き違いも少ない。意思決定しない人たちのミーティングならばお互いの懐を探りあい創造的な条件での合意を目指すことができる。

 

敵を知る。相手の会社、業界にとってこの取り引きはどれぐらい嬉しいのか。相手のBATNAは何か。

 

交渉が長引くのは当たり前なので悲観的に予測しておくこと。思わぬことが起こったら良い勉強だと思え。

 

三者のフェアな情報を使うことでお互いに基準ができる。

 

Framing

話の枠組みを変える。例えば偉い人がその部門で人が足りないという話をする会議で、部門でなく会社の人手不足の話に持っていく。

 

Bring negotiation

value
cost of status quo
influential allies

 

Start off

respect
frame as joint endeavor
openness for other side’s  interest and concern

 

Distributive Negotiationで役に立つ方法

Anchoringとcounteranchoring

Avoid Concession

交渉が面倒だから、良く思われたいからといって譲歩してはいけない。休憩して100万円稼ぐのがいかに大変か、100万円で何が出来るかを考えろ。Distributive negotiationの場合は相手に良く思われることは考えなくていい。

 

ほかに便利な技: 時間制限、組み合わせ

 

締結

もうすぐ終わりだと伝える。

さらに別の意思決定がある場合は余裕を持たせておく

相手がさらに迫ってくることの無いようにする

正式版ではなくとも書く

 

Integrative Negotiationで役に立つ方法

相手の話を聴くことが大切

Start with open-ended question about other party's interest concern, and goal. Ask what they don't care.

Ask underlying interest

Listen closely. At this phase, don't jump in cross-examine, correct or object.

Express empathy for concern

Adjust prior assumptions 

 

 

Framing

コップに半分水を注ぎ"half empty"というか"half full"というか。特をするように言葉を選ぶこと。

人間のリスク回避志向を利用する。人は将来のリスクを低く読む一方、すぐに手に入るものに価値を見る。A bird in the hand than two in the bush.

 

Continual Evaluation

新しい情報がでてくるものなので繰り返し何回も議論を重ねることを理解しながら進めること。アジャイル開発に近い考えがある。これば信頼を築きnegotiator's dilemmaを防ぐことにも繋がる。 "Now tell us something about your interest”.

 

 

 

Trust

Respect. Understand the other party’s need.

 

Stricture agreement that makes future benefits contigent on current compliance and performance.

Compliance transparency. E.g., periodic calculation loyalities for a proprietary technology.

Enforcement mechanism: security deposit, escrow arrangement, or penalties for noncompliance.

 

 

取引を阻むもの

Die-hard bargainers. Don't disclose.

Lack of trust. Go agile.

Structual impediments. Bring right people.

Cultural and gender difference.

Communication problem. Dialogue.

 

Escalation

Egos cannot abide “losing”

Auction among collectors

OPM: other people’s money

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

グリーンカード

自分の場合のアメリカ永住権取得のタイムラインです。準備開始から2年ぐらいかかかりました。こういうのは過ぎてしまうとすぐに忘れてしまうので他の人の参考になるように書き留めておきます。

 

2014年10月 渡米。会社内異動に使えるL-1Bビザ。5年間有効。

(2016年H-1B抽選外れる)

2016年7月 会社からグリーンカードのスポンサーシップの案内。移民弁護士とPERMの準備始まる。

2016年1月 PERMのためのJob postingが始まったとの案内を受ける

2017年3月 Job posting終わり。PERM申請。

(2017年 H-1B抽選外れる)

2017年6月 PERM承認。I-485のための健康診断。マンハッタンの南のほうにあるベンカット先生で1人$180ぐらい。

2017年7月 I-140(非premium processing)と同時にI-131、I-765、I-485申請。EB2。数週間後に受取通知届く(Texas Service Center)

2017年8月 Biometrics採取

2017年12月 I-131とI-765承認。EADカードが弁護士の所に届くもAdvanced Paroleが記載されていないUSCISのミス。L-1Bビザが有効なので特に問題なし。

2018年2月 I-140承認。

2018年3月 I-485がNational Benefits Centerに(無事)送られたとの通知。ちょっと前までならこのあとI-485承認で終わりなのだけれど昨年から雇用に基づくグリーンカードも面接が必要。

2018年4月 面接日通知

2018年5月 面接。弁護士付き添い(朝合流できないかと焦った)。次の日にI-485承認をオンラインで確認

(2018年もH-1Bの合格通知なし。多分3年連続で落ちてる)

2018年6月 グリーンカード届く

 

 

先人たちのブログ

http://blogger.splhack.org/2015/08/blog-post.html

https://blog.keikooda.net/2017/11/04/how-i-got-my-greencard/