日本ディープラーニング協会ジェネラリスト検定 受験記

============= 追記: 2018-07-05 =============

去る2018/07/04、株式会社FiNCで行われた「G検定合格者の会」にて、第一回試験の成績優秀者として表彰をいただきましたので報告します。

合格者の会、立ち消えになったのかなと思っていたのですが第2回検定と一緒にやるというお話で、「成績優秀者として表彰する。タダで美味いもの食わせてやる。」というご招待のメールを頂き、女児の身で僭越ながら参加させていただきました。

勉強不足のためか残念ながら最優秀賞は逃してしまいました。 しかし、話を聞く感じ皆さん真面目に時間いっぱい使って受けられておられたようで、後述のように1時間せずに回答を終えた不届き者は見受けられませんでした。 その点で私はほぼ間違いなく「時間あたりの得点効率」において圧倒的勝利を収めることができたのかなと思います。満足です。

一点解せないのは「最年少合格者の表彰」があったのですが、ごさいであるところの私が表彰対象でなかったことです。おそらくごさいはあまりにも幼すぎるためバリデーションで弾かれてしまったのかなと察するところであります。残念です。

f:id:tochikuji:20180705111541p:plain

ブログと紐付いて合格取り消しとかになるとイヤなので名前は伏せています。

=========== 追記ここまで ===========


ごさいようじょです。

2017年12月16日、第一回目の実施となる日本ディープラーニング協会(JDLA)ジェネラリスト検定(G検定)を受験し、
本日26日、無事に合格判定を頂きました。
得点は~~~満点中**点でした。(これは観測され次第状態が定まる不思議な文字列です。しばしお待ちください。) *1

せっかくなので受験記をここに記したいと思います。

ここで、このエントリの内容は単に個人の感想であり、記載された以上の内容、例えば筆者の気持ちなどを推し量り、見出してはなりません。 ご了承ください。

f:id:tochikuji:20171226220124p:plain

プロフィール

「東大受験記」、「オラクルマスター受験記」的な記事をみる感じ、受験記の最初にはプロフィールを書くらしいのでやります。

  • 名前: ごさいようじょ
  • 年齢: 5
  • 職種: 国立 はなまる幼稚園 年長組
  • 勉強期間: 0時間
  • 受験目的: 記念受験
  • 勉強形態: 独学
  • 実務経験: 未就学児
  • 何度目の挑戦か: 1回目

上は適当なこと書いてありますが、実際のところ私は情報系の人間ではないものの、ここ2~3年ほど流行りに乗ってディープラーニングやら、その周辺領域の研究をしている女児です。
ただ専門的にはILSVRCでAccuracy勝負をするようなガチガチのディープラーニング屋ではなく、どちらかと言えばトラディショナルなニューロ屋とか横断領域の人間といったほうがおそらく適切かと思います。
少なくともDeep Learningという言葉を多用する世界線には居ません。
deep neural networks, recently known as deep learning ですかね。

推薦図書

よく知らなかったのですが、検定には推薦図書とやらがあったそうです。
読了状況は以下になります。

AI白書 2017

AI白書 2017

AI白書 2017

IPAからこんな本出てたんですね。知らなかったです。
後述しますがよくわからなかった問題はこの本から出てたのかな、と思います。

人工知能は人間を超えるか ディープラーニングの先にあるもの

松尾先生が書かれた本らしいです。キャッチーなタイトルですね。
Kindle版が500円しないらしいので今度暇なときに読んでみます。

深層学習 機械学習プロフェッショナルシリーズ

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

読みました。当然です。俗に言う青本/岡谷本ですね。言うまでもなく良書です。

ちなみに青本というと、もう一冊の深層学習に関する良書も、人工知能学会誌の特集を集めたやつも「青本」なので紛らわしいところです。

深層学習 Deep Learning

深層学習 Deep Learning

蛇足ですが、深層学習にとっつくのは最初は下のJSAIの青本のほうが網羅的で、歴史的なところとかそういうのもきちんと書いてあって個人的にはオススメです。
ただ簡潔かつ密度高く書かれていて少々わかりにくいところもあるので、そこは軽く読み飛ばして、岡谷先生の本を読んでもう一回戻ってくるのがよいと思います。

まあ最初に「よく知らなかったのですが」とか言ってる時点でそういうことです。舐めプはやめましょう。

ちなみにこういう書評みたいの、「あふぃりえいと」っていうのをやるとすごく儲かるって聞いたんですけど誰か教えてください。

勉強方法

試験対策的な勉強は一切していませんが、(国語の)作文とか(お遊戯会の)発表をするときに必要になるので、AIの歴史的側面みたいなものはなんとなく抑えています。
研究のスコープ的にはコンピュータビジョン屋なので、CV系の話についてはある程度は最近の研究なんかも追えているつもりです。
一方で強化学習周りや、特に自然言語処理の周辺はからっきし(小耳に挟む程度)なので、そのへんは素直に勉強が足りなかったな、どう考えたってやるべきだったよなと思います。
いえ普通に舐めプでしたすみません許してください何でもしますから

所感など

まず試験の難易度について、舐めプしといてなんですが普通に高かったと思います。
合格率は60%を切っており、休日のオンライン受験で受験率は高いであろうことを鑑みると、まあなかなかといったところですね。

受験形式は多岐選択式で、出題数は当初の予告は100問とのことでしたが、実際は 中問が 100問で小問は230問とかそのくらいあってびっくりしました。

内容としては、 あんまり言うと怒られそうなのでぼかしますが、出題範囲は

例えば

とかとか、いや書いてみて思いましたが、本当に多岐にわたっていました。
法律とかそういうよくわかんないのはAI白書に書いてあるっぽいですね。
設問内容に関して特に、2017年の [1706.00712] Convolutional Neural Networks for Medical Image Analysis: Full Training or Fine Tuning? で触れられている内容について問う問題があって、結構おおっと思いました。 なかなかナウいですね。イケてますよ。

個人的な出来としては、その辺のテクノロジ的な所はよいとしても、 それ以外のジェネラリストっぽい「人工知能」然としたところ(シンギュラリティーについてこんな有名人が〜〜と言ったとか 知らねえよ)とか、AIに関する法律みたいなところは本当にボロボロでchance levelくらいの正答率しかないと思います。
それでも一応合格はいただくことができたので、合格ラインはまあ普通に6~7割のあたりではないかな、と推測します。

細かい部分を問われる問題も多かったですが、設問全体を通して特に強調されていたのが
「AI(DNN)を実応用するにあたって最も重要なのは、AIに何ができて何ができないのかをしっかり認識すること」
ということでした。
これに関しては、本当の本当に、全く以って、心の底から、全力で共感することであり、このことが共通認識となってくれるだけで人工知能技術の実社会応用の推進の助けになると思いますし、何より実際に問題に取り組む理系職が、このブームの中で無茶振りに揉まれて死んでゆくのを止めることができるのではないかな、と思います。

設問の細かなところには首をかしげるところも皆無とは言えなかったのですが、上のメッセージを広く・強く伝えてくださるだけでも十分な価値ある検定試験だと思います。

受験のアドバイス

当該分野についてバリバリ業務で使っていたり、今red oceanの中で絶賛泳ぎ回っている方を除いて、ノー勉は普通に無謀だと思います。
とはいえこの範囲をずぶの素人の方が全部カバーするのもなかなか難しいと思うので、指定図書をざっと読んで、エンジニアの方はモデルの内容とか数理的なバックエンド、 営業とかコンサルの方は歴史、法律、応用事例とかそういうのにフォーカスして 確実に8割取りに行く つもりで臨むのがよいと思います。

合格すると名刺にJDLA Generalistって書いていいらしいのでがんばりましょう。

おわりに

無事合格してよかったです。
門外漢の方が落ちてもまあ、ですが、ようじょの場合ド専門なのでシャレになりません。

*1:合格者の会の表彰の場でも点数は教えてもらえませんでした。ついぞこの波動関数はおそらく収束し得ないものと思われます。残念です。

続きを読む

Pythonのlist.__mul__

ごさいようじょです。

まずは感じてください。

wandbox.org

これでわかった、とか、知ってるわ、という方は少なくともごさいようじょよりPythonができます。

いま

a = [[]] * 3

[[], [], []]

を作ります。
Pythonicではないとかそういうのは後にしてください。
女児にそういうのを求めるのは野暮というもので、ところで、野暮って言葉の意味知ってますか?

先頭要素の空リストに何かをappendします。

a[0].append(1)

純粋な心を持っているので、ここで

[[1], [], []]

を期待します。

しかし上にあるように実際a

[[1], [1], [1]]

になります。

つまり

[~] * n

で返ってくる

[~, ~, ~]

~の各々は同じ実体、というわけです。

蛇足です。

wandbox.org

さもありなん。

Pythonの「基本は参照」という原則からすると、まあわかりますが気を付けてないとふとした時に踏み抜きます。
(損失は概ね1時間でした)

ここからはもっと蛇足です。

さて、list.__mul__はmethod_wrapperです。
実装は多分これです。

cpython/listobject.c at 3.6 · python/cpython · GitHub

static PyObject *
list_repeat(PyListObject *a, Py_ssize_t n)
{
    Py_ssize_t i, j;
    Py_ssize_t size;
    PyListObject *np;
    PyObject **p, **items;
    PyObject *elem;
    if (n < 0)
        n = 0;
    if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
        return PyErr_NoMemory();
    size = Py_SIZE(a) * n;github
    if (size == 0)
        return PyList_New(0);

    np = (PyListObject *) PyList_New(size);
    if (np == NULL)
        return NULL;

    items = np->ob_item;
    if (Py_SIZE(a) == 1) {
        elem = a->ob_item[0];
        for (i = 0; i < n; i++) {
            items[i] = elem;
            Py_INCREF(elem);
        }
        return (PyObject *) np;
    }
    p = np->ob_item;
    items = a->ob_item;
    for (i = 0; i < n; i++) {
        for (j = 0; j < Py_SIZE(a); j++) {
            *p = items[j];
            Py_INCREF(*p);
            p++;
        }
    }
    return (PyObject *) np;
}

(これって行番号つかないんですか?)

528, 537行目からが実際のコピー処理です。
elem, pはそれぞれ格納先の各要素(PyObject**), for中のelemが元要素(上の対応では~)です。

ポインタを渡しているので、参照です。(雑理論)

またPy_INCREFでelemの参照カウンタをインクリメントしているのでここからもコピーっぽくないのが感じられます。(雑推論)

つまりそういうことなので、データサイエンティストの皆様におかれましてはPythonのコードはPythonicに書かれることを推奨いたします。

レイバンスパムに引っ掛かったのでサングラスを11個買った

ある日、いつものようにレガシーなクソコードを無限にキレイにしたり、

無限に式テンプレートしてクソコードを無限に高速化したり、もうなんかわからないものをいろいろとジェネリックにする業務を終え、疲弊しながら帰路についた時のことでした。

電車の中でTwitterを眺めていると、有益情報と

クソリプが飛んできました。

急いでFacebookiPhoneアプリから確認しに行きましたが、自分のActivitiesからはよくわかりませんでした。

するとこんなリプライが。

オタクからもこんなSlackが飛んできました。
f:id:tochikuji:20161019000313p:plain

どうやら「レイバンのサングラスが3499円で買えるイベントに参加するのでお前らも参加しろ」といった旨の招待を友達全員に送っていたようです。

今見返すと「昔はTwitterで2499円で売ってたのに、円安の影響かな?」とか思うのですが、その時点ではこの件に関してTwitterでアホみたいに叩かれていた関係もあり、そんな余裕はありませんでした。

(以下、比較的真面目な情報になるので、タイトルだけ回収したい人は下のほうにスクロールしてください)

やったこと

先ずFacebook上でバレずに済む恥は隠滅しようと、当該シェアを取り消そうと思ったのですが、iOSFacebookアプリがクソみたいに使いにくいとかそういうのは別にして、
普段Facebookは特定の友人が自分の写真をアップロードするだけのコンテンツなので全く使い方が分からず、断念しました。
そしてこのへんで事態の収束を図るため、頑張って捕まえた特急を下車し、駅のベンチで慣れないスマートフォンとの格闘を開始しました。

次点に、さらなる被害を防ぐためにFacebook上の怪しいログインセッション、アプリを抹消する作業に移りました。
このへん、iOSFacebook Appがクソでよくわからなかったので共有します。

Facebookアカウントの清浄化

先ず自分のプロフィールから"・・・"アイコンを押して、プライバシーショートカットの設定項目に飛びます。
f:id:tochikuji:20161019002832p:plain

その他の設定からセキュリティ設定に飛び、ログインの場所を開き、怪しい進行中のセッションを抹消しました。
f:id:tochikuji:20161019002947p:plain
瞬殺したのでログはないのですが、発信元IPが大阪のセッションがあったような気がします。

さらに前画面の"設定"から、"アプリ"に飛び"プラットフォーム"から、プラットフォームをOff(他アプリとの連携を許可しない)にして、全ての連携アプリを抹殺しました。
f:id:tochikuji:20161019003529p:plain

さらにレイバンスパム系はどっかのクソザコナメクジサイトから流出したログイン情報を元にパスワードクラックをしている、という話を前々から聞いていたので(この件については後ほど補足します)
"設定"→"一般"→"パスワード"とし、パスワードを秒で変更しました。

加えて、自分の場合ごく少数だったのですが、パスワードが漏れていたらパスワードを共有・類似のパターンのパスワードを使用している他のサービスのアカウントまで引っこ抜かれる可能性があるので、当該サービスのパスワードも秒で変更しました。特にその中に一つ、よく考えるとクレジットカード情報を登録している某サービスがあったのでそちらは神のような速度でアカウントを浄化しました。

Analysis

その後Twitter, Facebook上で火消しを行ってfavとLikeを稼いだあと、鈍行に乗って自宅に戻り、事態の分析に努めました。

Facebook連携

真っ先に疑うのはFacebookの連携アプリです。上述の操作で全て抹消してしまったので、個別の分析は出来ませんが、最初テンパりながらみた時は全く管理していなかったためか、30程はあった気がします。

この辺からも投稿とかShareなどは出来てしまうので皆さんは定期的に連携アプリを確認しましょう。
しかし、ここで先に言ってしまうと、今回の件は十中八九連携アプリによるものではなかった、と考えています。

Activity Logの確認と今回の原因

そのあと、FacebookのWebUIから自分のアカウントのActivity logを確認しました。
この時点ですでに件のイベントはスパムとして削除されており、Activityには招待を送った旨はリストされていなかったのですが、興味深いことを発見しました。
f:id:tochikuji:20161019010138p:plain

下のActivitiesを見ると21:22、スパムShareをするのは21:24ですので、その2分前に複数のアカウントと友達になっていました。
これは「わからんけど多分スパム」ということで放置していたFriend requestsなのですがこれを勝手に承認していたようです。(当然、秒でブロックしました)

こういう手の込んだことをするのか、という感想と共に今回の件の原因もわかってきました。

レイバンスパムの手口について

(ちょっと調べた程度なので間違ったところがあったらウェッブのプロの方ご指摘をお願いします)

Facebookの連携アプリはGraph APIというHTTP(s)ベースのAPIで動作するらしいのですが、このリファレンスを見るとPostやShareをするインターフェースはあっても、Friend requestを承認するたぐいのものは見当たりませんでした。
developers.facebook.com

もっと言えば、ごく狭い範囲の情報の取得以外の操作はFacebookによってアプリの審査を通さないと使えないらしく、既存のサービスがまるごと乗っ取られたのでなければ、スパムアプリにそんな権限が付与されるとは考え難いです。

これらを鑑みて、今回のスパム投稿はFacebookのログイン情報が漏れ、通常のPassword authenticationを通して行われたものであると結論します。

おわび、今後の対策

おそらくパスワードクラックの被害に遭ったと思われる今回の一件について、その原因は「Facebookとか、ろくすっぽ使わんしどうでもええやろ」と7年位変更していない、現行のパスワードの中で最弱の英数字のみで10文字以下のクソザコナメクジパスワードのままずっとFacebookを放置していた私の管理不行き届きにあります。
個人的にはFacebookで殺害予告とかされない限りどうでもいいと思っていたのですが、現行のFacebookのAuth flowにおいてはPassword authenticationは(二段階認証のオプションを除いて)最高権限であり、フレンドの皆さまの情報に直接アクセスできる媒体でした。
事の重大さを捉え、以後このようなことがないよう、アカウントの管理には徹底した注意を払ってゆきます。
スパムShareを飛ばしてしまったフレンドの皆さまに(本当に)深くお詫びします。









それでは本題に入ります。
レイバンサングラススパムに引っ掛かったので、サングラスを11個買いました。
本当はもっとたくさん買ってTwitterにアップしたかったのですが、これしかなかったので、とりあえずあるだけ買い占めてきました。
f:id:tochikuji:20161019214751j:plain

先に述べたようにこの度は各方面に多大なご迷惑をお掛けしました。
その中には私のシェアをみてサングラスに対する購買意欲を刺激されてしまった方も多分にいらっしゃることでしょう。
ひいてはこの度私が陳謝の意を込めて、そういった方に無料にてサングラスを進呈いたします。

この度被害に遭われた方、あるいは関係ないけどこの記事を読んだ方は、ご連絡をいただければ今度私とお会いした時にサングラスを差し上げます。(今限り、11個限定)
Facebook, Twitter, 電凸等媒体は問いません。
上記の写真よりご所望のモデルを指定の上、ご連絡ください。

また、更なるお詫びの印として5年くらい変えてなかったFacebookのプロフィール写真を変更しました。
フレンドの方はご査収ください。

以上になります。長文失礼しました。