ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

F#でグラフ(チャート)を書いてみた。

2年に1回くらい思い出したようにF#を始める人です。

matplotlibがあるからPythonから離れられない事に気がつき、グラフの書き方を調べました。

www.apress.com

Expert F#を見ながら FSharp.Chartingを使えば、それなりに簡単にグラフ書けました。やったね。

f:id:natsutan:20200613131319p:plain

f:id:natsutan:20200613131334p:plain

以下、ソース。

open FSharp.Charting
let path = @"C:\home\myproj\study_fs\expertfs4\chap10\fig\"

let drawPoint =
    let rnd = System.Random()
    let rand() = rnd.NextDouble()
    
    let randomPoints = [for i in 0 .. 1000 -> 10.0 * rand(), 10.0 * rand() ]
    let chart =  Chart.Point randomPoints
    let output_file = path + @"point.png" 
    Chart.Save output_file chart
        
    printf "%s\n"  output_file

let drawCombileChart =
    let rnd = System.Random()
    let rand() = rnd.NextDouble()
    let randomTrend1 = [for i in 0.0 .. 0.1 .. 10.0 -> i, sin i + rand()]
    let randomTrend2 = [for i in 0.0 .. 0.1 .. 10.0 -> i, sin i + rand()]
    let c1 = Chart.Line(randomTrend1, Title = "Random Trend")
    let chart = Chart.Combine [c1 ; Chart.Line randomTrend2]
    let output_file = path + @"trend.png"    
    Chart.Save output_file chart
    
    printf "%s\n"  output_file


[<EntryPoint>]
let main argv =
    drawPoint |> ignore
    drawCombileChart |> ignore

    0 // return an integer exit code

TFLiteについて語る会

5月8日(金)にClusterを使ってオンラインイベントを開催しました。

tfug-kansai.connpass.com

Clusterを使ったイベントの様子です。今回は夕方開催なので、夜っぽい会場を選びました。

f:id:natsutan:20200509102354j:plain

ちなみに、僕は手前の女の子の姿で司会と発表していたつもりでしたが、会場の皆さんにはデフォルトのアバターが表示されていたようです。自分だけ違う姿が表示されるオンラインイベント怖いですね。(多分、Clusterクライアントの不具合)

f:id:natsutan:20200509102427p:plain

後ろから見るとこんな感じです。ちょっとごちゃごちゃしていますが、自分の近くの表示を消して見やすくすることも出来ます。

発表者としては、話をしながらリアクションをもらえるのがうれしいです。音声が発表者から参加者への一方通行なので、懇親会的な使い方は想定されて無さそうです。質疑応答や懇親会は別のサービスを用意した方がよさげ。

スマホでDeepLearning実践入門 くーむ(@cocodrips) さん

www.slideshare.net

TFLite周りのツールについて知らない事が多かったです。量子化についてちゃんと精度が落ちる話が聞けて良かったです。量子化が有効なタスクと、そうで無いタスクの情報はもっと共有したいです。量子化も基本的に成功事例しか発表されてないように感じますね。

Netron大事。TFLiteやるならまずNetron。

とても聞きやすい発表で良かったです。ありがとうございました。

TFLiteのグラフ構造について

www.slideshare.net

最近読んでいるゼロから作るDeep Learning③を最近読んでいて気がついたことをまとめました。良い本なのでお勧めです。

最後に

次回は、TFLiteファイルを実際に使ってこうしたとか、TF2.0対応について情報交換したいです。

Google Cloud AutoMLとAzure Custom Visionを比較してみた(識別編)

始めに(大事な話)

始めに言いたいことは、AutoMLは会社のお金で回しましょう。大事な事なので二回言います。AutoMLは会社のお金で回しましょう。

今回初めてAzure Custom Visionを使ってみたのですが、先にやっていた同僚から識別モデルなら無料枠に収まりますよという言葉を信じてやってみたところ、なんとAzure Custom Visionは2 プロジェクトまでは無料枠が使えるのですが3プロジェクト目からは無料枠を使えません。つまり、無料枠(金額)が残っていても請求が来ます。とりあえず試すとき4プロジェクト同時に動かした僕が悪いです。はい。

詳しくはこちらで確認してください。

azure.microsoft.com

というわけで、うっかり自腹で回してしまったのでブログのネタにしようと思います。

Google Cloud AutoMLとAzure Custom Visionとは

説明はいろいろあると思うので省略します。Azure Custom Visionは、転移学習ベースになっていて50枚程度の少ない枚数でも良い結果になると聞いています。

こちらの良くある質問より。

azure.microsoft.com

Custom Vision サービスは、画像間の主な違いをすばやく認識するように最適化されているので、少量のデータを含むモデルでプロトタイプの作成を始めることができます。ラベルあたり 50 個の画像から開始することをお勧めします。問題の複雑さと必要な精度に応じて、最終的なモデルに数百または数千個のサンプルが必要になる場合があります。

やったこと

両者のAutoML技術を使って、エッジ向けに出力されるモデルの比較を行いました。比較のためにデータは同じにしました。 Google Cloud AutoMLの方は、エッジ向け、速度優先、残りはデフォルトです。Azure Computer Visionは、General (compact)の設定にして、tfliteでexportしています。

f:id:natsutan:20200318213329p:plain:w300

学習時間はGoogle Cloud AutoMLはデフォルトのまま、Azure Custom VisionはMAX二時間の設定にしました。これはGoogle Cloud AutoMLがだいたい二時間くらいで終わるのでそれに合わせています。

エッジに持っていた時の計算量の違い等は次に調べたいです。

使ったデータ

Kaglleのdog vs catのデータを使いました。

www.kaggle.com

学習(train)データとして100枚、200枚、1000枚、2000枚の4パターンを試しました。犬、猫同じ数です。100枚は少ないのは十分承知ですがAzure Custom Visionが各クラス50枚でもいけると言っているのでお手並み拝見です。trainとvalidationの分割は特に指定せずデフォルトのままです。

testデータとして別途1000枚(犬500枚、猫500枚)を用意しました。

学習結果 その1

Google Cloud AutoML、Azure Custom Visionのレポートの値です。

Google Cloud AutoML

枚数 precision recall
100 90.0 90.0
200 85.0 85.0
1000 93.0 93.0
2000 97.5 97.5

Azure Custom Vision

枚数 precision recall
100 95.0 95.0
200 100.0 100.0
1000 97.0 97.0
2000 99.0 99.0

学習結果 その2

僕たちが知りたいのは汎化能力なので、testデータ1000枚でも調査しました。Google Cloud AutoML、Azure Custom Visionで、学習データもテストデータも同じデータで数字出しています。計算は単純に精度(accuracy)を出しています。データが千枚なので、正解数/1000です。

枚数 Google Cloud AutoML Azure Custom Vision
100 0.777 0.918
200 0.900 0.942
1000 0.947 0.914
2000 0.947 0.952

これはちょっと面白い結果になっています。Azure Custom Visionはデータ数が少ないときは、Google Cloud AutoMLよりも精度が高く、データ数が増えてくると、だいたい同じような結果になります。これだけで判断するのは難しいですが、やはり各クラス1000枚くらいあった方がよいんじゃないでしょうか。

あと学習結果その1と比べてみるとわかりますが、Google Cloud AutoML、Azure Custom Visionどちらを使うにしても、訓練データ(バリデーションデータ)への過学習は避けられないと思います。特にAzure Custom Visionは99%, 100%とレポートされますが、実際はもう少し現実的な値におさまりそうです。

今回は自然画像が多くなかなか100%に近づけるのは難しいと思いますが、背景を揃えたりできるとGoogle Cloud AutoML、Azure Custom Visionで差がでてくる可能性もあります。もう少しいろんなデータセットで試してみたいところです。

例えば少ない学習データで、この画像で猫はきつい気がします。

f:id:natsutan:20200318213043j:plain:w200

Azure Custom Visionが1000枚で一度精度が下がるのも、もう少し条件振って検証したいです。(お金がかかるのでやりません)

実装上の注意

推論エンジンはQumicoのサンプルを参考に、どちらもtf.lite.Interpreterを使いました。

github.com

Google Cloud AutoML、Azure Custom Visionで変更したのは2つです。

入力フォーマット

Google Cloud AutoMLは画像をuint8で入力しますが、Azure Cumputer Visionはfloat32で入力します。

ラベル

Azure Custom Visionは4回やって猫が0、犬が1でしたが、Google Cloud AutoMLは犬、猫がランダムにくるので毎回確認する必要がありました。

まとめ

AutoMLは会社のお金で回そう。

推論用ソースコード(参考)

ダウンロードしたtfliteを動かしたときのサンプルコードです。参考になるかも。

import numpy as np
import os
import sys
import tensorflow as tf
from PIL import Image

WIDTH = 224
HEIGHT = 224

def infer(interpreter, image_path):

    image = Image.open(image_path)
    resized_image = image.resize((WIDTH, HEIGHT), Image.BICUBIC)

    image_data = np.array(resized_image, dtype='uint8')
    inputs = np.ascontiguousarray(np.expand_dims(image_data, axis=0))

    interpreter.set_tensor(interpreter.get_input_details()[0]["index"], inputs)
    interpreter.invoke()
    predictions = interpreter.get_tensor(interpreter.get_output_details()[0]["index"])
    np.set_printoptions(threshold=sys.maxsize)
    label_index = np.argmax(predictions)
    return label_index


def calc_accuracy(model_path, img_dir, log_name, n=1000, cat=0):
    cat_num = n // 2
    dog_num = n - cat_num

    interpreter = tf.lite.Interpreter(model_path=str(model_path))
    interpreter.allocate_tensors()

    err = 0
    with open(log_name, 'w') as fp:
        for i in range(cat_num):
            fname = "cat.%4d.jpg" % (i + 1000)
            image_path = os.path.join(img_dir, 'cats', fname)
            result = infer(interpreter, image_path)
            if result != cat:
                fp.write("ERROR:%s\n" % fname)
                err += 1

        for i in range(dog_num):
            fname = "dog.%4d.jpg" % (i + 1000)
            image_path = os.path.join(img_dir, 'dogs', fname)
            result = infer(interpreter, image_path)
            if result == cat:
                fp.write("ERROR:%s\n" % fname)
                err += 1

        acc = (n - err) / n
        fp.write("ACC:%f\n" % acc)

    print(acc)
    return acc


if __name__ == "__main__":

    image_root = 'D:/data/dog_and_cat_small/dog_and_cat_small/dog_and_cat_small/validation/'
    model_50 = 'C:/home/myproj/automl_azure_gcp/gcp/50/50_model-export_icn_tflite-dog_cat_50_20200316013707-2020-03-16T06_53_44.875Z_model.tflite'
    model_100 = 'C:/home/myproj/automl_azure_gcp/gcp/100/100_model-export_icn_tflite-dog_cat_100_20200316013837-2020-03-16T06_55_15.299Z_model.tflite'
    model_500 = 'C:/home/myproj/automl_azure_gcp/gcp/500/500_model-export_icn_tflite-dog_cat_500_20200316014602-2020-03-16T06_56_26.836Z_model.tflite'
    model_1000 = 'C:/home/myproj/automl_azure_gcp/gcp/1000/1000_model-export_icn_tflite-dog_cat_1000_20200316020838-2020-03-16T06_57_48.485Z_model.tflite'
    models = [model_50, model_100, model_500, model_1000]
    logs = ['log/gcp_50.log', 'log/gcp_100.log', 'log/gcp_500.log', 'log/gcp_1000.log']
    cat_numbers = [0, 1, 1, 0]

    for model, log, cat in zip(models, logs, cat_numbers):
        calc_accuracy(model, image_root, log, n=1000, cat=cat)

    print("finish")

JDLA E資格合格体験記

無事E資格に合格したので、後に続く人の参考になればと思い合格体験記を書きます。

spec

試験勉強を始める前に、どれだけの知識・経験があるのかは勉強量に大きく差がでてきます。簡単に自分のスペックをまとめるとこんな感じです。

  • 理学部物理学科卒
  • 仕事で組込の画像処理を10年以上
  • CNNや物体検出は、推論をCで実装して人に教えられるレベル
  • CourseraのMLコースを最後までやった
  • ゼロから作るディープラーニングは①、②とも実装済み。

大学で習ってない数学(ベイズや情報理論)が全然駄目で、機械学習は少々、Deep Learningは画像系のCNN以外は実務経験も無しという感じです。画像処理(Computer Vision)では、普通に線形代数を使うので行列の苦手意識は無かったです。

作戦

認定講座はスキルアップAIを選びました。会社のお金で受講するのでなるべく安くするように指示があり、2社まで絞ってスキルアップAIを選びました。この時点ではどこが良いのかさっぱり分からなかったですが、もう一社の方は競合禁止的な縛りが厳しく断念しました。受講していないので比較は出来ないのですが、スキルアップAIの講座は素晴らしく、最後まで諦めることなく勉強を続ける事ができました。お勧めです。

www.skillupai.com

講義の内容はこちらに詳しく書いてあります。認定試験を突破するためには、通常の受講に加えて以下の4点をクリアーする必要があります。

  • ①通し課題において基準精度を達成し、そのソースコード一式を提出
  • ②DL、ML、数学の知識テストに合格

スキルアップAIの講座に申し込むと、推薦図書を教えてもらえるのでリストを見ながら持っていない物は全部購入し、Mindjet社のMindmapを使って、いつ何を勉強するのかを整理しました。

f:id:natsutan:20200304081452p:plain
mm

カリキュラムの前半が既知の部分だったので、この間に上の課題をクリアーするようにしました。数学が分からないと勉強が二度手間になるので、数学→機械学習→Deep Learningの順番で合格できるようにスケジュールを立てました。会社には週の1日はE資格の勉強に充てるとは宣言していたのですが、業務が忙しくなればそんなことは言ってられないのでなるべく前倒しで勉強していきました。後半からぐっと難易度が上がったので正解でした。 なんにせよ最初に数学をやってしまうのが良いと思います。特にスキルアップAIの講座では数学と機械学習は別講座で、分かっている前提で講義が進みます。最初に数学は押さえましょう。

基本的な周期としては、こんな感じです。

  • ①ゼロから作るdeep learningやイラストで学ぶディープラーニングで予習しながらノートを作る。
  • ②ノートを見ながら予習動画を見る。勘違いしていたところはノートに赤線。理解が怪しいところは質問
  • ③演習課題を解く。理解が怪しいところを質問
  • ④「深層学習」の対応する場所を読む
  • ⑤暗記する所は単語帳を作成。

勉強の進捗は会社の週報で報告しました。他の人に取っては不要な情報ですが、必ず報告する事で進捗の管理がしっかりできました。今も当時の報告を見ながら振り返っています。

老眼が始まっていたので、まず近距離眼鏡を新調しました。これも良かったです。

時期別対策

10月

まずは数学を固めながら、ゼロから作るdeep learning①をひたすら実装して行きました。この本の実装をするのが2回目で、CourseraのMLコースでも近いことをやっていたので、実質三週目。講義の演習も含めると人生で4回実装したことになります。合わせて逆行列の復習や機械学習のエッセンスをさっと呼んでました。無事、数学の試験を突破。

11月

機械学習の総復習。scikit-learnとTFによる実践機械学習、機械学習のエッセンス等を手を動かして勉強していきました。いろんなCNNの応用に絡んでイラストで学ぶディープラーニングに出てくるネットワークや用語をノートにまとめてました。あとim2colの復習。

MNISTっぽい通し課題もこの辺で終わらせるつもりでしたが予想以上に難易度が高く、ぐぬぬとなってました。

順調に勉強ができていた時期です。無事、機械学習の試験を突破。この時は最後100点で突破したのでうれしかったです。

12月

勉強が苦しくなってきた時です。仕事で大きな失注がありモチベーションが下がっていた所に、未知のゾーンである生成モデルに入りました。生成モデルの数式は覚えれば良いのですが、特にVAEが何をやっているのか分からなくて先生に何度も質問をしていました。予習を完全に終わらせてから講義に入るというサイクルが崩れかけたのがこの頃です。

会社から有休取れプレッシャーが厳しくなってきたので、12月の最後は有給を取って1週間休みにしながらも会社でずっとE資格の勉強をしていました。休みだって言ってるのに、【重要】みたいな会議の連絡が飛んできていくつかは会議に出ましたが、勉強する場所代だと思って会議出てました。この追い込み時期で、ゼロから作るディープラーニング②の実装、通し課題、DL試験を突破しました。特にDL試験は、強化学習やアテンション等勉強していないところがあるにも関わらず一発で合格したので、だいぶ自信つきました。

ここで、講義の課題をクリアーしないと試験の申し込みすらできないと言うことに気がつき勉強のピッチを上げました。申し込み自体は誰でもできて、試験本番までに課題をクリアーすると思ってました。有給で全力で課題に取り組んだ結果、年内に試験の申し込みできました。近くて大きな会場の方が有利なので、早めに申し込んだ方が良いですね。

年末にスキルアップAIから模試の連絡が入りました。個人で払うには結構なお値段ですが、確実に合格率が上がると思ったので即答で申し込みました。結果的にはこの模試は非常に良かったです。会社に交渉すれば会社の経費で受けられた可能性もありましたが、上に書いたように大きな失注をした後だったので気が引けました。

1月

1月2日までは確実に勉強していたのですが、3日から勉強しなくなってしまいました。家族の調子が悪くなったり、仕事も上手く行かず下がったモチベーションを上げるのは難しかったです。作りながら学ぶ深層強化学習をなんとかやりきり、講義はギリギリついて行ったレベルです。単語帳やノートの復習なども全然出来なかったです。

1月はプリキュアが終わりに向かい、毎週プリキュア終わるの嫌だーって泣いてました。今もこれ書きながら最終回のカウントダウンを思い出して泣けてきました。

2月

2月に入って新しいプリキュアが始まると急にモチベーション上がってきました。良かった。

月初に模試を受けました。模試のおかげで10点くらいは点数が上がったと思います。機械があるなら是非受けましょう。

2月は新しいテキストは一切せず、通勤中に単語帳で覚える、作ったノートの復習、逆行列や特異値分解を確実にできるようにしていました。苦手な所の講義動画を見ながら、再度演習を解いてました。

模試は受けよう

スキルアップAIの講座を受講していると試験直前に模試を受ける事ができました。合格率を確実にあげるので、みんな受けた方が良いです。今までの講義と違い、完全に資格対策なので解説なども点を取るための解説が聞けます。特に始めて受験する方には重要なアドバイスをいくつももらえました。僕はこの模試で自分の間違えるポイントが良く分かりました。

まず行列の計算が出来てなかったこと。特異値分解のレベルで無く、2x2の固有値を求める程度の問題が、式は完全に頭に入っているのに計算を間違える事に気がつきました。ゆっくり計算をしながら何処で間違えるのかを調べると、近距離の眼鏡をかけてないと自分の書いた字がよく見えて無くて五分五分で計算間違いをしていることに気がつきました。ここから毎日逆行列の計算をしたり、特異値分解をするようにしました。試験当日も確実に近距離の眼鏡で受検するようにしました。

もう一つが、山が当たったときに問題を最後まで読まない癖も分かりました。具体的にはLSTMやGRUの活性化関数を選ぶ問題で、予想通りの問題が出るとうれしくなってtanhではなくそれより先に出てきたtanを選んでしまいました。模試でミスしたおかげで、どんなにeasyに見える問題でも最後まで選択肢読もうと心に決めました。

こんな感じで自分の弱点がわかるので、ぜひ模試は受けて欲しいです。

模試に関してはスキルアップAIさんにお願いしたいことが一つありました。講座の申し込み時に模試をオプションで示して欲しかったです。会社のお金で受ける場合、後から追加で決済を上げるというのは難しく結局自腹で受講してしまいました。模試があるなら、最初から模試込みで決済を上げられるので確実に会社のお金で模試受けられるのでうれしい人多いと思います。

勉強に使った本

教科書

実質、この3冊は教科書かと。

深層学習

試験の数式がこの本の書き方からでるので必読。本の説明そのままの問題もでます。何気に、Deep Learningに必要な数学の所は良くまとまっていると思います。

ゼロから作るディープラーニング① ②

これを母国語で読めるのは幸せ。全部読んで実装しよう。

数学

初めての情報理論

エントロピーやKLダイバージェンスが演習付きで学べます。機械学習やディープラーニングで良く出てくる -p*log(p)を実際に簡単な例題で計算することで雰囲気が良く分かって良いです。

これなら分かる応用数学教室

以前から持っていた本です。行列の手計算はこの本が一番分かりやすいです。こちらも手を動かして理解を確認できます。

機械学習

まずはCourseraのMLコースだと思います。言語がoctaveなのでPythonと同時に学ぶと混乱します。E資格の勉強を始める前に最後までやりきると良いです。

初めてのパターン認識

一通りのことは書いてあるので、全部読んだ方が良いです。良く分からなくなったらこの本に戻る感じで使ってました。

PRML

分からない所を読んでもさっぱりですが、分かったところを読むと面白い本でした。ちょっとでも分からない所が出てきたらそれ以上読まないという使い方をしていました。個人的にこの本の数式が好きですし、正則化等理解してから読むと点が上がりそうな気がします。確率分布がまとまっているのも良かったです。

scikit-learnとTFによる実践機械学習

テキストがライブラリの使い方について書いてるのかアルゴリズムについて書いているのか微妙な感じで勉強のテキストとしてはどうよってのは正直あります。ただ、各手法に対してライブラリを使って結果がみれるというのは良かったです。コードメインで。

機械学習のエッセンス

PCAの実装確認はこの本を参考にしました。試験対策としては、(そういう本じゃ無いので)微妙なところはあるのですが、プログラミングの本として読んでいると、筆者の軸足がプログラマより数学者よりで面白い記述が所々にありました。(なんか読んでいておもしれーって所が何カ所があったのですが記録するのを忘れました。)間違いなく良い本です。

Deep Learning

基本的に、講義の内容を押さえ、上に書いた教科書をやっておけば良いかと思います。 CourseraのMLコースは、正則化やモーメンタムといった学習アルゴリズムもカバーしているのでお勧めです。

GoogleNetや物体検出については、このCourseraの2回目と3回目が分かりやすかったです。

www.coursera.org

MobileNet含むCNN全般に関してはこれも参考になりました。マーチンが日本に来たときに、直で聞けたので印象に残っています。

www.youtube.com

強化学習については、たくさん本を買って比べる時間が無かったので最初にやった一冊だけを紹介します。他の深層教科学習の本が駄目というわけではないので、いろいろ探してみてください。強化学習に関してはスキルアップAIの講座のテキストが一番良かったです。ある程度試験対策と割り切って、俯瞰的な説明がありなんとなく雰囲気は分かって正解は選べるようになりました。

PythonとKerasによるディープラーニング

いろいろ動くコードが載っているので勉強になります。試験範囲ではデータオーギュメンテーション、AE、VAE、GAN、転移学習辺りが参考になるかと。

作りながら学ぶ深層強化学習

手を動かしながら強化学習を動かすというスタンスで分かりやすかったです。とりあえずこの本で勉強すればなんとなく実装の雰囲気と、数式が分かるのと思います。強化学習は他にも良さそうな本がありましたが、時間なくこの一冊しか読めませんでした。

最後に

振り返って見ると、1月以外はモチベーションを上手く保てたかなと思います。10月からの勉強時間はざっくり400時間です。最初に会社に相談して、週の1日はE資格の勉強に当てることでOKもらいました。それでは足りないので毎日2時間程度+土日のどちらかは一日勉強。12月末は休みをがっつり取って勉強に充てました。勉強時間多いですが、シラバス以外のOpenPoseやブースティング等、名前だけ知っていた物もノートにまとめたりしていたので若干遠回りはしています。合格したから言えますが勉強楽しかったです。

試験前日は下見に行き、不安を感じている自分に気がついたのでプリティストアによってキュアエールのグッズを買ってきました。当日問題が難しかったときも、キュアエールが応援してくれたので頑張れたと思います。とにかく自分のモチベーションの状態を分かるようにすることと、モチベーションを上げた状態の保ち方を確立してあると勉強が続けられるかなと思います。

試験結果はこんな感じで、まあ安全圏にはいるけども間違いもそこそこありました。

応用数学:91.67% 機械学習:84.62% 深層学習:84.42%

スキルアップAIの先生には本当にお世話になりました。分からない所は直ぐ教えていただきました。若く個性的な先生が多く、ああ時代は若い人が主役になってるんだなとヒシヒシと感じました。他の人のもやっとした質問にも丁寧に答えられているなという印象でした。振り返って見て記憶に残っているのはVAEで、何回も何回も分かるまで答えていただきました。正直その時は分かってなかったのですが、2月くらいに突然なるほどと腑に落ちたので教えていただいた成果がでました。試験にもバッチリ出て、正解を選ぶことが出来ました。先生のおかげで無事合格できました。ありがとうございます。これから受ける方はスキルアップAIお勧めしておきます。

INSPIRED 熱狂させる製品を生み出すプロダクトマネジメント

PM(プロダクトマネージャ)の必読本と言われたので読んでみました。

https://www.amazon.co.jp/dp/B0814STTHV/

読めば読むほどPMの仕事と責任が増える本でした。これもPMの仕事、これもPMの仕事と幅広い話題の中でPMの役割を俯瞰的に説明しています。

ぶっちゃけた感想を言うと読みにくい本でした。毎日にコツコツ読んでいかないとなかなか最後まで読めない。根本的な所で本の中に出てくるPMにあこがれの気持ちが持てないのが大きい。例えば、Abobe製品のサブスクリプション化を進めた素晴らしいPMとしてAbobeのリーヒックマンが紹介されています。この説明を読んでよし僕も彼のようにやってみようとは思わなくて、むしろお金払ったら自分の物にしたい僕に取っては、むしろこうなって駄目ではと思ってしまいした。会社に取っては利益をたたき出すPMでも、お客にとっては本当に素晴らしいことをしたのかどうか等と考えるとPMの評価は難しいなと感じました。

全体的にまじめに書いてあって幅広いトピックを扱っているので、PMやっていれば何かしら心に響く所はあると思います。眼からうろこといった記述は少なく、新規事業をやっている人であれば普段感じている事にいちいち新しい名前を付けて丁寧に説明してるなという感想でした。言語化大事。

内容以外で読みにくい所があり、ちょっと気になりました。全体に通しのChapter番号が振られてしまっていて、どういうツリー構造(章立て)を読んでいるのかわからなくなることが多かったです。章のタイトルも、「発見のアイディエーションテクニック」とかタイトルの意味が分からなかったり、「イノベーションが失われる最大の理由」の内容はGoogleが上手く行っている理由が列挙されていたり、細かいところが読みにくかったです。

PM本気でやる人にはお勧めしておきます。

JDLAのE資格受験してきました

2月22日の土曜日に、日本ディープラーニング協会(JDLA)のE資格を受験してきました。合格発表は3/3です。合否は微妙なところですが感想を書きます。

受験のシステムについて

同じ会場に同じ受験をする人が集まるのかと思っていましたが、一つの会場で別の試験も同時にやってました。時間も〇〇時ジャストに始まるのではなく、各自が試験用のパソコンでログインして開始を押してから2時間というシステムでした。11時からの試験開始で申し込んで、30分前に会場につき最後の30分でこれを頭に叩き込もうと思って会場に入ったところ、なし崩し的に試験が始まってしまいだいぶ焦りました。

試験の内容についてこういうことをしては駄目よと誓約書みたいなものを書いたのですが、最後計算用紙とともに回収されてしまったので、良くわかりません。ダイレクトに問題を書かなければ大丈夫だと記憶しています。

試験の内容について

初めての受験だったので過去との比較はできませんが、だいぶ聞いていた問題とは違った感じを受けました。今回から変わったのか、毎回こんな感じなのかは気になります。全体的に機械学習多め、数学少な目に感じました。単純な知識を問う問題と、論文を早く理解するための問題が多かったと思います。有名な論文に出てくるグラフや表から、何がわかりますか?というのは良い問題だと思いました。

数学の問題

全体的に数学の知識が必要な問題が多いが、計算力そのものを問う問題は少なかったです。

機械学習

従来手法としての機械学習のアルゴリズムが出ました。単純にSVMならカーネルトリックみたいにキーワードだけ覚えていると歯が立たない問題が多かったです。単純に知識を聞いている問題ではなく、よく考えればわかりそうなギリギリの選択肢でした。機械学習のアルゴリズムについてディスカッションとか何かしらの会話をしていると楽に解けそうです。逆に独学で教科書だけ読んで、Pythonの実装を写しているだけだと難しいんじゃないかと思いました。

Deep Learning

活性化関数のグラフはどれとか、このなかでGoogleNetはどれでしょう、のような使い古された問題が出ませんでした。先に書いたように、論文の図表などをヒントに、正解を選ばせる問題が多かったです。これも試験向けの暗記ではなく、何か会話をしていないと難しい感じがしました。

Python実装

これが一番戸惑ったところで、事前に聞いていたような問題が出ませんでした。im2colならこの辺丸暗記しておけば正解選べるじゃんってのが通じませんでした。みんなも丸暗記したよね。

img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)

axis=0, axis=1を問う問題は五分五分で当たっていると思います。(さっぱりわからんかった)

試験を受けてみた感想

全体的に考えさせられる良い問題が多かったと感じました。特に、この問題Deep Learningの知識と関係ある?というような問題がでず、一問一問がしっかり考える必要がある問題でした。最初の3問くらいで想定したより難易度が高く泣きが入ったのですが、僕がわからない問題はほかの人もわからないはずと気を取り直して最後までできました。問題が公表されないが残念です。過去問がでると簡単に対策取れますし、1年に2回濃い問題を作るのも大変だと思うので、しょうがないのかなと思います。試験を受けながらも勉強になる問題でした。

自信をもって答えられたのは半分もなかったです。ただ残りの問題も全く分からないという問題はなく、2択まで絞れたり、消去法でよくわからんけどこれみたいところまでは行けました。合格、不合格どちらもありそうです。勉強した成果は十分ぶつけられたので、実力がそのまま結果になると思います。

ドキドキしながら3/3を待ちたいと思います。

数理最適化: Optimization Night #2

先週ブレインパッド様の会場をお借りして、数理最適化の勉強会を開催しました。今回は大阪大学の梅谷先生をお呼びして非常に濃い勉強回となりました。LTも個性的な面白い発表でした。発表していただいた方、会場を提供いただいたブレインパッド様、ありがとうございました。

組合せ最適化による問題解決の実践的なアプローチ 梅谷先生

発表資料はこちらです。

speakerdeck.com

アルゴリズム的な話は無しで、実際の事例中心という事で始まりましたが、アルゴリズムの話もかなりあり、楽しんで聞いていたらあっという間に発表が終わってしまいました。

アルゴリズムの話の合間に、現実の辛い話がでてくるのが涙無しでは聞けなかったです。例えば、製造業はデータを集めにくい、現場の反発、意思決定が重いのでビジネスに向かないとか、せっかく作った最適解を使ってもらえなかった話とか、アルゴリズムだけで無く本当に貴重なお話が聞けました。

発表や質疑応答の中で出てくるこうすれば良いよねというテクニックが、ことごとく自力では全く思いつかないような話ばっかりで、この分野僕には無理かなという感じがしました。

Gurobi最適化の本が、問題をどうソルバーに解ける状態に持って行けるかについて詳しく書いてあるとの情報をもらいました。この本は僕が数理最適化の勉強をしようとした最初の本で、当時サンプルプログラム動かしておもしれーで終わっていたので、もう一度読んだら新しい発見ありそうです。

tatsu-zine.com

達人出版さんから出ているの知らなかった。

巡回セールスパーソン問題 with 遺伝的アルゴリズム 〜進化の様子を眺めよう〜 TaikiSugiyama さん

遺伝アルゴリズムと可視化とターミナルで描画する話。デモでぐだぐだした結果、その場にいた全員が早く問題を解いてくれという気持ちで一つになれました。デモの中で、交差している経路が上手く解消されるのを見せられるのは上手いなと思いました。経路が交差しているかの検出と解消は決定的なアルゴリズムでも直せるので、逆に無理矢理交差させて解消したらもとより良くなったを期待してましたが、最後そんなのはどうでも良くなる楽しい発表でした。

発表資料はこちらです。

www.slideshare.net

不協和音のないパート割当 y_izng さん

最後は吹奏楽部のパート割り当て問題。単純に人数だけ見るのでは無くメンバーの卒業も考慮したした割り当ては弱小吹奏楽部だと生命線だったりします。そこで数理最適化ですよ。

安定マッチングを使った実際の事例として面白かったです。

speakerdeck.com

最後に

今回もすごく濃く面白い勉強会でした。

離散最適化の勉強をするには、Coursera Discrete Optimizationコースがお勧めです。これをやっていたおかげで、発表もだいたいうんうんとうなずきながら聞くことができました。コースを終わった感想も書いてます。

natsutan.hatenablog.com

勉強会が終わった後もSlackでは面白い話が続いています。興味がある人はぜひ参加してください。