stMind

about Tech, Computer vision and Machine learning

Internetのインタフェース

融けるデザイン ―ハード×ソフト×ネット時代の新たな設計論

融けるデザイン ―ハード×ソフト×ネット時代の新たな設計論

これはGW前から読んでいた一冊。まだ読了していないけど、とても興味深かったのが「Internetのインタフェースをどうデザインするか」という箇所。

これを見て思い出したのが、MITの石井教授の「情報は流水で、デバイスは蛇口」の話とかnext.rikunabi.com

Google Glassとか、ちょっと古いけどSixth Senseなど。 www.ted.com

現状のインタフェースの問題は、スマホタブレットの普及のおかげで日常のあらゆる場面で情報を得ることは出来ても、情報を得て人間が行動し、問題を解決するところまでには至ってないところだとこの書籍では述べられていて、なるほどなと思いました。Apple Watchが発売されて、スマートウォッチ系がホットな話題になってますが、これも一歩進んだ情報の取得手段でしかなくて、アクチュエータ的なインタフェースになってないと考えると、それほどエポックメイキングなデバイスになっていないのではないかという説明が出来る気がしました。

やっぱり、スマートウォッチはまだ過渡期で、ウェアラブルというかユビキタスというか、その辺りを狙う一つのステップなんじゃないかというように思います。

大企業向けのリーンスタートアップ論

シリアル・イノベーター ─ 「非シリコンバレー型」イノベーションの流儀

シリアル・イノベーター ─ 「非シリコンバレー型」イノベーションの流儀

GWに一気読みしました。

この本の内容を一言で表すなら、「大企業向けリーンスタートアップ」。 顧客ニーズの理解と技術的解決策の探求を反復しながら、顧客の真の課題を再定義し、その課題に対してシンプルな解決策を再構成するというプロセスが、ブレークスルー型イノベーションを実現するための方法であるというのは、まさにリーンスタートアップ的な考え方だと感じました。 この本で一つ特徴的なのは、大企業における社内政治を考慮している点で、既存事業の維持と改善に大半のリソースが使われる組織を動かすには、他人を巻き込み賛同を得る、データで説得する、会社の戦略に適合させる努力をするなど、他部門まかせになりがちなプロセスも技術者が主体的に行わなければならないと述べられています。

新しい考え方ではないと思いますが、実例も多く記載されているので、自分の組織を思い浮かべながら、どうアレンジすればいいかと考えながら読んでみると、意外に新しい発見があるかもしれません。

プランクトン画像分類で1位になったチームの解説ブログのメモ(2)

benanne.github.io

プランクトン画像分類で1位を取ったチームの解説ブログを読み進めました。 今回は、ネットワークアーキテクチャの所。

Kaggleで1位を取るためには、これくらいの改良をする必要があるんですね...勉強になります。

Network architecture

  • OxfordNetに強くインスパイアされたアーキテクチャ
    • 最終的には16層のNNで構成
      • 6層から始めて、精度向上を確かめながら1層ずつ追加
    • 補足: OxfordNet
      • Input: 224x224, RGB
        • 前処理でRGBの平均値を各ピクセルから引いておく
      • conv layer: 3x3. strideは1ピクセル. 出力は入力と同サイズ.
      • pooling layer: 5つのmax pooling層. 2x2. strideは2ピクセル
      • fully connected layer: 4096チャネルが2層と1000チャネルが1層
      • softmax layer
      • 隠れ層は全部ReLU
  • Cyclic pooling
    • 概要
      • 回転に対する不変性を獲得するため
      • 0度, 90度, 180度, 270度の4種類の回転を適用した画像
      • 4画像を並列処理、出力される特徴マップをpooling(4-way cyclic pooling)
    • 実装は効率的
      • 4種類の回転処理に内挿は不要
    • バッチサイズを4分の1に削減
    • root-mean-square poolingが一番よい結果
      • mean poolingとmax poolingと比較して
    • 8-way cyclic poolingも実施
      • 0度, 45度の入力画像を生成
      • 8-way cyclic pooling + dihedral poolingはうまくいかなかった
  • Rolling feature maps
    • 4-way cyclic poolingで出力された特徴マップを結合、次層の入力とする
    • 結合操作をroll operationと呼ぶ
      • 0+90+180+270, 90+180+270+0, 180+270+0+90, 270+0+90+180
    • 結果として実際の4倍のFilterを持つことに相当する
    • CUDAとTheanoをPyCUDAで連携させて実装
    • roll operationなしでcyclic poolingを含むNetworkは可能だが、cyclic poolingなしでroll operationを含むNetworkは出来ない
  • Nonlinearites
    • leaky ReLUsを使うと最も良い結果が得られた
      • y = max(x, a*x)
      • aはスケール係数で0にすれば通常のReLU
      • 最終的にa = 1/3とした
  • Spatial pooling
    • 最終的にpooling層は4つ使用した
    • 2x2のmax-poolingからトライしたが、最終的には3x3でstride2(3x3s2)のmax-poolingを使った
      • 計算コストを大きく上げることなく、大きいサイズの入力画像を使うことができた
        • 5x5の特徴マップを得るのに4層の2x2のmax-poolingだと入力画像サイズは80x80
        • 3x3s2のmax-poolingだと95x95で同じ5x5の特徴マップを得ることが出来る
  • Multiscale architectures
    • 画像サイズに基づいてリスケールした入力画像を使うネットワークと、固定係数でリスケールした入力画像を使う小さいネットワークとの組み合わせがベスト
  • Additional image features
    • 画像特徴を抽出して入力とするネットワークを学習
      • softmax層の手前で結合するので'late fusing'と呼ぶ
    • 試した特徴の例(太字は最終的に使用した特徴)
      • Image size in pixels
      • Size and shape estimates based on image moments
      • Hu moments
      • Zernike moments
      • Parameter Free Threshold Adjacency Statistics
      • Linear Binary Patterns
      • Haralick texture features
      • Feature from the competition tutorial
      • Combinations of the above
    • 太字の3つの特徴は精度向上に際立っていた
  • Example convnet architecture
    • convolution層: 10
    • fully connected層: 3
    • spatial pooling層: 4
    • 入力: (32, 1, 95, 95) = (batch size, num of channels, height, width)
    • 出力: (32, 121) = 121クラスに対する確率
Layer type Size Output shape
cyclic slice(回転でbatch size4倍) (128, 1, 95, 95)
convolution 32 3x3 filters (128, 32, 95, 95)
convolution 16 3x3 filters (128, 16, 95, 95)
max pooling 3x3, stride 2 (128, 16, 47, 47)
cyclic roll(回転でchannel数4倍) (128, 64, 47, 47)
convolution 64 3x3 filters (128, 64, 47, 47)
convolution 32 3x3 filters (128, 32, 47, 47)
max pooling 3x3 stride 2 (128, 32, 23, 23)
cyclic roll (128, 128, 23, 23)
convolution 128, 3x3 filters (128, 128, 23, 23)
convolution 128, 3x3 filters (128, 128, 23, 23)
convolution 64, 3x3 filters (128, 64, 23, 23)
max pooling 3x3 stride 2 (128, 64, 11, 11)
cyclic roll (128, 256, 11, 11)
convolution 256, 3x3 filters (128, 256, 11, 11)
convolution 256, 3x3 filters (128, 256, 11, 11)
convolution 128, 3x3 filters (128, 128, 11, 11)
max pooling 3x3 stride 2 (128, 128, 5, 5)
cyclic roll (128, 512, 5, 5)
fully connected 512, 2 piece maxout units (128, 512)
cyclic pooling(4方向の特徴マップを統合) (32, 512)
fully connected 512 2 piece maxout units (32, 512)
fully connected 121-way softmax (32, 121)

プランクトン画像分類で1位になったチームの解説ブログのメモ(1)

プランクトン画像分類でトップを取ったチームが、自分たちが採用した手法を解説したブログエントリーを 書いてくれています。

benanne.github.io

今回のコンペはフォーラムを読む英語力と、そこで公開されてたcxxnetをビルドする根気があれば、 それだけでそこそこの順位に位置することが出来たんですが(半分より上くらい)、 そこから上位に行こうと思うと当然、機械学習の実践的な知識と実装力が必要になってきて、 初期設定に対してちょちょっとデータ増やしただけではどうにも順位が上がらなかったです。

1位となるような手法は何が違うのかなといった所はかなり興味深い所なので、 読んだことをメモしておきます。 結構長いので、まずはPre-processing and data augmentationまでを。

  • Introduction
    • Software and Hardware
      • numpy
      • theano
      • cuDNN
        • CUDA Deep Neural Network library
      • pyCUDA
      • Lasagne
      • scikit-image
        • for preprocessing and data augmentation
      • ghalton
        • quasi random number generator
      • GPU
        • NVIDIA GTX980, GTX680, Tesla K40
  • Pre-processing and data augmentation
    • Pre-processing
      • Rescaling
        • プランクトン画像のサイズはバラバラなので重要
        • 固定サイズ化
      • Zero Mean Unit Variance
      • プランクトンのサイズ推定
        • image momentsを使って推定
        • Rescalingに使ってみたが結果は変わらず
        • ただし、分類の時の特徴量として使ってみたら結果が良くなった(後述)
      • Data augmentation
        • データセットのサイズを大きくする
        • アフィン変換の手法を適用
          • rotation: 0-360度の間でランダム(一様)
          • translation: -10から10ピクセルの間でランダム(一様)
          • rescaling: 1/1.6から1.6の間でランダム(対数一様)
          • flipping: する or しない(ベルヌーイ)
          • shearing: -20度から20度の間でランダム(一様)
          • stretching: 1/1.3から1.3の間でランダム(対数一様)
        • realtime augmentation
          • 学習フェーズで実行する
          • CPUで実行(学習はGPU
        • パフォーマンスが改善しなかったこと
          • elastic distortion
          • gaussian distribution
            • uniformから変えてみたが結果は改善されず

cxxnetでKaggleのプランクトン画像分類に取り組んだ話

www.kaggle.com

最終結果は286th / 1049でした。

f:id:satojkovic:20150318224423p:plain

今回、初めてKaggleのコンペティションに参加しましたが、やってみて思ったことを書き留めておきます。

  • Forumに投稿されているDeep LearningベースのStarter Codeを使うことでそこそこの順位に位置することが出来る
    • エラーが出てビルド出来ないよ!って言ってる人もたくさんいるので、ビルド&実行して結果をSubmit出来るだけでもDeep Learningではない手法よりも上位にいける
    • ただし、Deep Learningの手法同士の競争はむしろそこから
  • 次のアプローチとしてデータ増強(Data Augmentation)をまずはやってみると良さげ
    • 自分がやったのは、画像の上下、左右フリップ
    • 回転もやってみたが、むしろ順位は下がってしまった
    • Kaggle CIFAR-10の話 - デーが参考になった
    • Forumにも同じ話題があるので
  • GPU必須
    • 最初、自分のMacbookProで実行していたけれど、データ増強で学習画像数を増やせば増やすほど時間がかかってやってらんない
    • cxxnetはGPUで実行するオプションがある
    • GPUのマシンとか持ってなければ、AWSのEC2にNVIDIAが用意しているGPUインスタンスがあるのでそれを使うと良い
    • 1日以上かかっていたのが、1、2時間で学習できるようになった

とかやってたら、Yosemiteをアップデートしたタイミングで、起動しなくなるというトラブルに見まわれ、 復旧に時間がかかってこれ以上は出来ませんでした(若干言い訳)。

一応Starter Codeの素の状態で1.382285ということなんで、0.3くらいのスコア改善は出来たかなという感じです。

参考資料

今回のコンペティションで1位を取ったチームのまとめエントリーがありました。

benanne.github.io

Netflixの中の人が書いた「Ten lessons learned from building machine learning system」というブログエントリーのメモ

TechnoCalifornia: Ten Lessons Learned from Building (real-life impactful) Machine Learning Systems

少し前のエントリーですが、ざくっとポイントをメモしました。

Ten lessons

  1. More data and better models
    • どちらかだけにフォーカスすると、うまくいかない
      • あなたの問題では追加データが必要かもしれないし、またはモデルを改良する必要があるかもしれない
  2. You might not need all your big data
    • 全データのうち、どのサブセットを使うかが重要
    • データが多いほど精度が上がるというわけではない
  3. The fact that a more complex models does not improve things does not mean you don't need one
    • 「複雑なモデルを使えば改善するのではない」という事実は、複雑なモデルが不要ということを意味するのではない
    • 多次元の複雑な特徴を使う場合は複雑なモデルが必要、逆も同じ
    • 特徴量とモデルをパラレルに改善する事が重要
  4. Be thoughtful about how you define your training/testing data sets
    • データセットは注意深く扱うようにしなければいけない
      • positiveとnegativeのラベルを付けるのは簡単ではない
  5. Learn to deal with (the curse of) presentation bias
  6. The UI is the only communication channel between the Algorithm and what matters most: the Users
  7. Data and Models are great. You know what is even better? The right evaluation approach
    • 最も重要なレッスンかもしれない
    • 正しい評価手法がなければデータ、モデル、インフラは意味をなさない
    • Offline ExperimentationとOnline Experimentation
      • Offline Experimentationはおなじみの機械学習アルゴリズムの評価ステップのこと
      • Online Experimentationで最も有用なのはA/Bテスト
  8. Distributing algorithms? Yes, but what at level?
    • 分散処理させたいタイミングがやってくるけれど、問題はどのレベルで分散させるか
    • 3つのレベル
      • Lv.1. 個々に独立した全データのサブセット単位
      • Lv.2. ハイパーパラメータの組み合わせ単位
      • Lv.3. 各学習データサンプルにおけるモデル学習の単位
    • AWSを使って分散処理させた例がNetflixのTechblogに掲載
  9. It pays off to be smart about your hyperparamters
    • ハイパーパラメータのチューニングを繰り返し実行するための仕組みは重要
  10. There are things you can do offline and there are things you can’t…and there is Nearline for everything in between
    • システムアーキテクチャの話
      • OfflineとOnline、Nearlineの3層
      • Nearline: OnlineとOfflineの間(造語?)
    • レイテンシーについて考えると、MLアルゴリズムをどのレイヤで実行するかにブレイクダウンする手助けになる
    • NetflixのTechblogに掲載

Conclusions

  1. 持っているデータを注意深く考察して扱い
  2. データとモデルの依存性を理解し
  3. 正しい評価指標を選択し
  4. 目的に対してのみ最適化する

MediumのBack channelが面白い

特にSteven Levyの記事が良いです。

Webで読めるニュース記事というよりは、キーパーソンのインタビューやニュースになった事象の裏側の話がまとめられた内容で、 なんとなく本に近い感じがしました。

今のところ、6つの記事が公開されてます。

Twitterのマネタイズの話も面白いです。

Twitterはユニークユーザの増加は諦めていて(完全に諦めてはないと思うけど)、ユーザが増えなくても収益をあげられるように、 テレビとか他のウェブサイトとか、Twitter以外の場所に拡散したTweet(Off-Twitter)から収益を得るモデルを構築しているんだとか。 であれば、最近Twitterのユーザ数の伸びがなくなって成長が止まったというニュースがあったけど、実はTwitter内部ではそれほど 問題視してないのかもしれないですね。

英語で、しかも一記事が長文なので(4500単語くらいある)、全部読むのはかなり大変ですが...