統計学・機械学習・深層学習

2021/01/11

Pythonデータ分析試験、Python基礎エンジニア試験に合格した感想~Pythonの機械学習や深層学習が目指すのは因果推論ではないか

Pythonデータ分析試験、Python基礎エンジニア試験に無事に合格できた。
感想をラフなメモ。

【参考】
Pythonデータ分析試験 | 一般社団法人Pythonエンジニア育成推進協会

Python基礎試験 | 一般社団法人Pythonエンジニア育成推進協会

【1】Python基礎エンジニア試験は簡単だったが、Pythonデータ分析試験は難しかった。

Python基礎エンジニア試験は、RubyやJavaを知っていれば、それら言語のライブラリを比較しながら理解すれば良かった。
Pythonは確かに書きやすい。
Rubyのように異音同義語のようなAPIはないし、文法も簡素だし、Tabのインデントだけでプログラミングできるので、手に馴染む。

しかし、Pythonデータ分析試験では、Numpy・Pandas・MatplotLib・sklearnの割とたくさんのAPIを覚える必要があるし、統計学や線形代数の数学の知識、分類・回帰・次元削減・クラスタリングなどの機械学習の知識も必要になるので、Python以外の知識習得に手間取った。
統計検定2級、G検定も取得していたので、それらの知識に慣れているから1ヶ月で十分だろう、と思ったが、実際は2ヶ月以上習得にかかった。
まだまだ、Pythonのセンスが足りないので勉強すべきと分かった。

なお、Python基礎エンジニア試験の教科書「Pythonチュートリアル 第3版」、Pythonデータ分析試験の教科書「Pythonによるあたらしいデータ分析の教科書」は持っておいた方がいい。
このAPIはどうだったけ?と振り返る時に、辞書代わりになる。

【2】Python基礎エンジニア試験、Pythonデータ分析試験で良かったのは、Web上の模擬問題が充実していること。

PRIME STUDY(プライム・スタディ) ? Python試験とPHP試験の無料模擬試験サイト

G検定、Python、Rubyの模擬テスト | DIVE INTO EXAM

上記のWeb問題を5~10回転ぐらいやって100%得点できてから受験したので、そんなに緊張感はなかった。
特に、PRIME STUDYの問題の方が確かに難しかったけれど、出題内容は「Pythonによるあたらしいデータ分析の教科書」と全く同じなので、理解に役立った。

【3】Pythonデータ分析試験、Python基礎エンジニア試験を良かったことは、3つある。

【3-1】プログラミングはブロックを組み立てる感覚が大切、と改めて感じたこと。

Python 初心者だから、Numpy、Pandas、Matplotlib、sklearnのAPIでつまづいてるけど、機械学習は面白い。
教師ありデータなら、train_test_splitして、機械学習のモデルにfitで学習させて、scoreで評価し、最後にpredictで予測する。
実際は、そういうデータの前処理に大量のロジックを組み込むわけだが。

すると、1行でもロジックというブロックが崩れると、プログラムは意図通りに動かなくなる。
ちょうど、積み木の途中で1個のブロックが崩れると、全てが崩れてしまうみたいな感じ。
プログラミングはとても繊細な作業。

プログラミングが書けるかどうかは、そういうセンスに依存する所も大きいと思う。

「60%の人間はプログラミングの素質がない」記事のリンク: プログラマの思索

【3-2】プログラミングは書くだけでなく、開発環境も大事、と改めて感じたこと。

Pythonが良いのは、Anacondaで一通りのライブラリが揃い、ライブラリのバージョンごとに依存した開発環境を別々に保持できること。
一方、RubyならGemのバージョン依存にすごく手間取るし、Ruby初心者はRailsの環境構築ですぐにつまずいてしまう悲しさがあると思う。

また、PyCharmという開発環境がとても良い。
コード補完できて、デバッグもできるので、プログラミングにストレスがない。
一方、コンソール画面で対話形式でPythonをプログラミングできるよ、ブラウザ上でJupytorNotebookでグラフも書けるよ、と言われても、やっぱりコード補完できないのは辛い。

僕は、IntelliJの有償ライセンスを購入したので、JupytorNotebook上でもコード補完もデバッグもできて、ああ、こういう風に動いてるのか、とか、初心者レベルからの気づきがあった。
プログラミング初心者はこういうつまらないレベルでつまずいて、先に行けなくなるから。

DockerやAnsibleの考え方もそこに通じているのではないか、と思う。

【3-3】Pythonを通じて、最先端の技術に簡単にたどり着けること。

線形代数や微積分、統計学の数学の知識は、それがなくても、Pythonを書きながら慣れていけばいい。
Numpyのブロードキャストやユニバーサルファンクションに慣れれば、自然に線形代数は理解できるはず。
統計量の計算、データの前処理となる分散正規化、ヒストグラムで表示する前処理となる層化抽出法、などは、PandasやMatplotLib、sklearnに慣れれば、理解できるはず。
sklearnのSGDライブラリを使いこなせれば、微積分の考え方も分かるはず。
もちろん、「ゼロから始めるディープラーニング」のサンプルプログラムを動かしながら慣れていけば、ディープラーニングだけでなく、微分における極小値や最小値の違い、鞍点のイメージも理解できるはず。

つまり、Pythonの機械学習ライブラリを使いこなせるようになれば、自然に、統計学・線形代数・微積分の知識も身につくはずだ。
紙と鉛筆で計算することも大事だが、プログラミングでは、要は動かしてナンボの世界だから。

そして、今のIT技術の最先端に一度到達できれば、他の分野でも、初心者レベルから今の自分のレベルまでに到達するにはどれくらいの道のりが必要なのか、そこから先にはどんな課題が控えているのか、を想像できるようになる。
そうすれば、すごく楽しくなる。

おかげで、Pythonの機械学習や深層学習の本が読めるようになってきたので、乱読できるのがすごく楽しい。
まずは「Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎」から読み始めていて、今頃になって、そういう意味だったのか、とか色々気づきがあった。

【4】Pythonの機械学習や深層学習ライブラリを覚えた後で、やりたいことは、目の前の問題事象に対し、原因とその予測を見つける因果推論ではないか。

100件以上のデータがあれば、分類モデルや回帰モデルで簡単にモデルを試せて、やりたい問題が解けるのに感激した。
最終的にやりたいのは、目の前の問題やイベントに対して、誰も見つけなかった因果関係の発掘だよな、と思う。

Python でプログラムを書ければ、誰でも新しい因果関係を発見して、経験則と言う法則を作り出せる。
たとえば、行動経済学や公共経済学であれば、こういう政策を政府が提示した場合、国民の消費活動や企業の生産活動はどう予測されるか、などの問題も、スマホやWebで収集した大量データをクラウド上に集めて、機械学習や深層学習のエンジンでモデルを学習させれば、その結果を予測することもできる。
つまり、回帰分析のように、予測したい目的変数に対し、有意な説明変数を見つけることで、単に相関関係を見つけるだけででなく、AならばBとなる、といった因果推論まで提示できるはず。

経済学は信頼性革命や構造推定により大きく変貌している: プログラマの思索

機械学習で反実仮想や自然実験が作れる: プログラマの思索

IT企業が経済学者を雇い始めた理由が面白い: プログラマの思索

社会現象や人間の心理に対し、こういう因果推論を経験則、法則として数多く見出すことができれば、それらは一つの規範を示す。
つまり、哲学の言う、ザイン(である・存在)ではなく、ゾルレン(かくあるべし・規範)を学問として提示できるはず。
最終的には、全ての文系学問の出てくる諸問題は、統計確率論を基盤としたPythonの機械学習や深層学習で実装されたモデルから導かれる規範を樹形図のように整理するだけで、自然科学の中の一つの学問分野に収斂されるのではないだろうか。

こういう技術が直近10年で当たり前になったのもすごいし、こういう技術を知らずに、今までの知識や技術に固執するのも一つのリスクだな、と思う。

| | コメント (0)

2020/12/18

Pythonデータ分析の気づき

Pythonデータ分析ライブラリでコーディングしていると、いくつか気づきがある。
初心者のラフなメモ。

【参考】
Pandas Cheat Sheetのリンク: プログラマの思索

ゆるふわPandasチートシートのリンク: プログラマの思索

scikit-learn「アルゴリズム・チートシート」のリンク: プログラマの思索

NumPyを図解で理解する: プログラマの思索

Python と R の違いのリンク: プログラマの思索

Numpyは普通の行列計算だが、常識と違う部分がある。
ブロードキャストとユニバーサルファンクション。
いずれも、行列の要素に一括計算できる。

2つの行列のShapeが違う場合に、ブロードキャストできるかどうかでまだ間違える。

Numpyのブロードキャストの挙動 - Qiita

NumPy♪ブロードキャストを雰囲気で理解していませんか? | Snow Tree in June

ゼロから作るDeep Learning」を読むと、シグモイド関数の計算でNumpyのブロードキャストがトリックとして上手く使われていると感じた。

Pandasは、SQLの代わりになること、グラフ表示の2つがある。
concat, merge, groupbyなど色々ある。
ExcelもCSVも読み込めるので、SQLの代わりとして、データの結合・抽出・マージ・分割が簡単にできる。

Pandasのグラフ表示は簡単だが、割と癖があるように思う。
MatplotLibとは使い方が微妙に異なるのでまだ間違う。

データフレームに利用人数、利用料金があったとする。
利用料金ごとの人数をヒストグラムで表示する場合、同じ結果を出すソースコードが4種類もある。

df["利用料金"].hist()
plt.show()

df["利用料金"].plot(kind='hist')
plt.show()

df["利用料金"].value_counts().plot.bar()
plt.show()

df["利用料金"].value_counts().plot(kind="bar")
plt.show()

Pandasでヒストグラムの作成や頻度を出力する方法 - DeepAge

とはいえ、Pandasに慣れると、Excelの表データがあれば、データ読み込み→データ集計と整形→折れ線グラフ・棒グラフ・散布図などでグラフ表示までの処理をスクリプトで簡単にかける。
VBマクロやExcelのピボットテーブルもいらない。
特に、散布図が簡単にかけるのはいい。

MatplotLibは多彩なグラフが書ける。
グラフの種類が多い。
plot, pie, bar, barh, scatter, hist, boxplot, corr。
積み上げ棒グラフも簡単。

グラフ要素を細かく設定できる。
枠線・折れ線・棒の色や太さ、凡例、タイトル、などなど。
引数の細かい仕様を覚えるのは面倒だが、凝った作りにできる。

skelarnは機械学習をお手軽に実践できる。
データをテスト・検証用データに分けて、fit→predictするだけ。
サンプル数が100程度でも十分に色々遊べる。

skelarnは、おおまかに、カテゴリで分類すること、回帰モデルで予測すること、の2つ。
アルゴリズムが多いので、どれがどの場面で有効なのか、1個ずつ、抑える。

モデル評価も、分類・回帰の2つ。
混同行列は「分類モデル」を評価する。
「回帰モデル」を評価するのは、MAE, MSE, RMSE, 決定係数の 4 つ。

ROC曲線を見て、最近、コロナニュースでよく聞く、偽陽性率と真陽性率の話も関係することが何となく分かってきた気がする。
そういうことを考えると、機械学習がこんなに簡単なPythonライブラリで初心者が簡単に扱えることがすごいし、統計やデータ分析を知らない専門家の話はアホかな、とか思う時もある。

機械学習をきちんと理解したいので、「Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎」を読み始めた。
他の本も色々立ち読みしてみたが、この本が初心者でも取り掛かりやすいように思った。

| | コメント (0)

2020/12/06

Pandas Cheat Sheetのリンク

Pandas Cheat Sheetを見つけたのでメモ。
他にも、Numpyとか色々あるので参考にする。
最初はこういうシートがあると参考になる

【参考1】
Pandas Cheat Sheet

Pandas Cheat Sheet(PDF)



【参考2】
(Cheat Sheet) Matplotlib: Plotting in Python - DataCamp

NumPy Cheat Sheet: Data Analysis in Python - DataCamp

Python For Data Science - A Cheat Sheet For Beginners - DataCamp

SciPy Cheat Sheet: Linear Algebra in Python - DataCamp

Pandas Cheat Sheet for Data Science in Python - DataCamp

Scikit-Learn Cheat Sheet: Python Machine Learning - DataCamp

Collecting Data Science Cheat Sheets | by Karlijn Willems | Towards Data Science

探せば色々あるね。
MatplotLibとかNumpyのチートシートも役立つ。

【参考3】
データサイエンスや機械学習のチートシートを最も効率的に収集する方法 - Qiita

FavioVazquez/ds-cheatsheets: List of Data Science Cheatsheets to rule the world

最初からここを探せばよかったかもしれない。
Pythonのデータ分析ライブラリ以外にも、RやSQL、Keras、ggplot2とか色々ある。

こういうチートシートは辞書代わりに使いたい。
こういう事がやりたい、という問題意識がある時に、どんな手法で実現できるか、ということを手早く知りたいから。


| | コメント (0)

2020/12/04

scikit-learn「アルゴリズム・チートシート」のリンク

scikit-learn「アルゴリズム・チートシート」があるのでメモ。

【参考】
【機械学習初心者向け】scikit-learn「アルゴリズム・チートシート」の全手法を実装・解説してみた - Qiita

Scikit-Learn のチート・シートに沿って機械学習 ? FRONT

Choosing the right estimator ? scikit-learn 0.23.2 documentation

scikit-learnで機械学習のプログラムを書こうとする時、ライブラリが多いので最初は戸惑う。
このチートシートがあれば、ああ、この時はこのライブラリを使うのね、と参考になる。

scikit-learnにあるサンプルデータで遊ぶだけでも割と面白いね。
やりたいのは、データを元に、因果関係を推論して、新たな因果関係という経験則を生み出すこと。
そういう道具がPythonで簡単に揃って使えるのは面白い。
業務システムをデータモデリングで考えるのとは別の発想。

| | コメント (0)

2020/10/31

アジャイル動画「私もアジャイルに飛びこんだの! -- 『品質重視のアジャイル開発』の誉田さんインタビュー」がいいね

アジャイル動画「私もアジャイルに飛びこんだの! -- 『品質重視のアジャイル開発』の誉田さんインタビュー」がいいと思ったのでリンクしておく。

私もアジャイルに飛びこんだの! -- 『品質重視のアジャイル開発』の誉田さんインタビュー ? アジャイル動画

「私もアジャイルに飛びこんだの!」というフレーズがとても可愛いのだが、誉田さんはNECでCMMIレベル5の導入運用に携わった人と聞いているので、そのギャップの違いに惹かれた。

『品質重視のアジャイル開発』を書いた動機は、色んな人から、アジャイル開発では品質保証はどうやっているのか?と聞かれて、その解答を自分から答えようとしたこと、と聞いて、すごく納得した。

実際、『品質重視のアジャイル開発』では、P.32で「顧客が納得するアジャイル開発の品質保証方法は確立されていない。本書は、その課題の解決に挑戦している」という言葉がある。
この言葉にすごくしびれた。

上記の動画では、誉田さんは、私は2010年頃からアジャイル開発に携わったので、平鍋さん他皆さんとはそこまでアジャイル開発の経験を持っていないと謙遜されていたが、『品質重視のアジャイル開発』の内容はとても充実していると思う。

上記の動画の最後でも紹介されているが、アジャイル開発はミニWF型開発ではない。
アジャイル開発はミニWF型開発とみなしてしまうと、必ず大火傷を負う。
それはなぜか?

アジャイル開発の特徴はとにかく期間が短いことだ、と著者は言う。
WF型開発では半年かけて、各工程にゲートを設けて品質チェックし、品質を担保していく。
そのやり方をアジャイル開発にそのまま適用しても、短期間の制約があるから、必ず現場が混乱する。

一方で、WF型開発の品質保証で得られた知見である「プロセス品質」「プロダクト品質」の考え方はアジャイル開発にも通用する。
アジャイル開発でもその考え方を適用する。
プロセス品質では、技術プラクティスを習慣にし、開発チームの構成に配慮すること。
プロダクト品質では、Done判定を出荷判定基準とみなし、バックログの順番に頻繁に品質保証していくこと。

個人的には、「Done判定を出荷判定基準」とみなす観点は有効な知見だと思う。
ソフトウェア品質保証は、WF型開発でもアジャイル開発でも、同じような概念や観点は共通で存在するし、その背景には、品質はどんな開発プロセスであれ必要なのだ、という思想があるのだと思う。

また、『品質重視のアジャイル開発』では、アジャイル開発にもWF型開発のメトリクス分析を適用しようとして、色々苦労されている内容がある。
結論は、定量データを用いてアジャイル開発のプロセスを分析するのは難しい、ということだ。
理由は、アジャイル開発では、短期でリリースするので、スプリント単位の開発規模は小さいために、メトリクスのばらつきが大きくなるからだ。
すなわち、開発規模やチームの生産性のばらつきが大きいために、Velocityで複数チームの生産性を比較するのは有意味なりにくいし、各チームの開発状況を分析するのが難しいのだ。

考えてみれば、規模が小さいのでばらつきが大きくなる、というのは当たり前なのだが、結局、短期間リリースと定量データ分析はトレードオフなのかな、と感じる。

また、『品質重視のアジャイル開発』本は、品質保証の観点で噛み砕いて解説してくれているので、WF型開発バリバリのプロジェクトリーダーがアジャイル開発に取り組む時に役立つと思う。

| | コメント (0)

2020/08/28

画像セグメンテーションのリンク

以下は画像セグメンテーションのリンク。
「物体認識」「物体検出」「セマンティックセグメンテーション」の違いを知るためにメモ。

画像生成でセグメンテーション?GANを使った教師なしセグメンテーション手法が登場! | AI-SCHOLAR.TECH

SegNet: 画像セグメンテーションニューラルネットワーク - Qiita

画像セグメンテーションのためのU-net概要紹介 技術ブログ | アクセルユニバース株式会社

【物体検出】SSD(Single Shot MultiBox Detector)の解説 技術ブログ | アクセルユニバース株式会社

(引用開始)
近年、様々な分野で画像認識技術が活用されています。これは深層学習技術の発展によって、画像認識の精度が大幅に向上したためです。画像認識技術には三段階のステップに分けられます。

1つ目は、画像に何が写っているか判断する「物体認識」です。「物体認識」では画像に何が写っているか判断するだけで、その物体の位置までは判断しません。
2つ目は、画像に写っている物体の名前と位置を判断する「物体検出」です。
3つ目は、画像のピクセル単位で物体認識を行う「セマンティックセグメンテーション」です。人間はピクセル単位で物体を認識しており、「セマンティックセグメンテーション」は私たちと同様の画像認識を機械に行わせる試みと言えます。その応用範囲は自動運転や医療など、様々な分野に渡ります。

これら3つを総称して画像認識技術と言い、「物体認識」「物体検出」「セマンティックセグメンテーション」の順に教師データを作成するのに必要なコストは高くなります。特に、ピクセル単位でラベル付けを行う必要のある「セマンティックセグメンテーション」は他の2つに比べて、教師データの作成に非常に高いコストが掛かります。
(引用終了)

CNNをベースに画像認識する時、「物体認識」「物体検出」「セマンティックセグメンテーション」の順に難易度は高くなる。
教師データがより複雑になるし、CNNも複雑に組合せたアルゴリズムになる。


| | コメント (0)

2020/07/01

シグモイド関数とソフトマックス関数の違い

以下はメモ書き。

教師あり学習には、クラス分類と回帰の2種類がある。
ディープラーニングの出力層の活性化関数は種類分けする。
2クラス分類ならシグモイド関数。
他クラス分類ならソフトマックス関数。
回帰ならば、恒等関数。

機械学習 - なぜシグモイド関数では多クラス分類できず、ソフトマックス関数では多クラス分類できるのか?|teratail

回帰は予測するので、出力時に何も変えずにそのまま渡す。

シグモイド関数は滑らかなので微分できるゆえに、層を重ねるごとに伝播させやすい。
しかし、勾配消失/爆発しやすい。

ソフトマックス関数は、総和が1になる性質を持つので、確率分布とみなせる。
だから他クラス分類に使える。

| | コメント (0)

2020/06/14

SaaSのビジネスモデルがアジャイル開発を促進したという仮説

「ソフトウェア・ファースト」を読んで、改めて、アジャイル開発はSaaSの開発プロセスを発展させたものとみなすのだと考えた。
ラフなメモ書き。

【参考】
ソフトウェア・ファーストの感想: プログラマの思索

【1】「ソフトウェア・ファースト」を読むと、製造業などの一般産業は、SaaSのようにどんどんサービス化すべきだ、という主張が背景にあるのが分かる。

では、SaaSというビジネスモデルの特徴や本質は何だろうか?

この問いに自分なりに考えてみたら、複数の特徴があるように思う。

【2】SaaSはScrumと相性が良い。
たとえば、パッケージ製品ビジネスや大量生産ビジネスでは、たくさん作って販売してそれで終わり。
一括請負契約で作って納品したら終わり。
顧客とメーカーは、クライアント-ベンダー-アンチパターンにはまりやすい。

「クライアント-ベンダーアンチパターン」という根本問題: プログラマの思索

一方、SaaSでは、常にサービスや機能を頻繁にVerUpしていく。
その頻度も1ヶ月に1回ではなく、1日に数十回もざらだ。
SaaSのインターフェイスは、ユーザがスマホやPCで触っているので、すぐにその機能を試してもらえるし、彼らの要望を即座に反映するほど、顧客満足も高まる。
そういうニーズがあるので、頻繁なリリースを実施する動機づけになる。

その場合、社内の開発体制はScrumに似せると開発しやすくなる。
マーケティング担当者や経営者がプロダクトオーナーの役割を担えば、社内に開発チームとスクラムマスターを作れば、即座にScrumが出来上がる。
SaaSの場合、プロダクトオーナーに相当する人が社内に存在し、その能力を持ち合わせている時も多いのがメリットだろう。
その後は、会社の規模やビジネスの規模に合わせて、Scrumをスケールすればいい。

【3】SaaSはDevOpsと相性が良い。
リリースしたら、その後も運用し続けるので、開発と運用保守は一体化すべき流れになる。

一方、普通のSIであれば、インフラチームと開発チームは分離されていて、機能別組織になりやすい。
機能別組織の弱点は、チームや組織ごとに体制の壁ができてしまい、意思疎通が困難になることだ。
コンウェイの法則「アーキテクチャは組織に従う」によって、システムのアーキテクチャは縦割りの複雑な組織構造を反映した形になってしまい、システムはどんどん複雑化してしまう。

もちろんSaaSも、ビジネスが発展すれば肥大化するだろう。
しかし、開発と運用保守は一体化した方がいいというビジネス要求や現場からの要求が出てきやすいので、DevOpsを推進する動機づけになる。

もちろん、技術的にも、SaaSはクラウドと相性が良い。
だから、クラウドエンジニアはインフラエンジニアだけでなく、開発者でもありうるので、事実上、インフラチームと開発チームは一体化しやすい。

また、ここからマイクロサービス・アーキテクチャも実装しやすい。
AWS上でSaaSを運用すれば、LambdaやAurora、AWSの各種サービスを利用することになるだろう。
単に性能改善やスケールメリットが活かせるだけでなく、システム基盤をマイクロサービスとして組み立て直すことにより、SaaSは汎用的なAPI基盤になっていくだろう。
そうすれば、外部サービスと連携できるので、より多種多様な機能を顧客に提供しやすくなるメリットも出てくる。

【4】SaaSはB2Cのプラットフォームビジネスと言える。

アメリカのGoogle、Amazon、Apple、Facebookがそうだし、中国のBATも同様だ。
多数の顧客に対し、プラットフォームを提供することで利便性がどんどん増していく。
そのビジネスの本質は、製造業が持つ規模の経済ではなく、ソフトウェア特有のネットワークの経済という理論が背景にあるはず。
たくさんのユーザが使ってくれるほど、SaaSは重要性を増して、売上を指数関数的増大させていく。
「プラットフォーム革命――経済を支配するビジネスモデルはどう機能し、どう作られるのか」を読むと、プラットフォームのビジネスモデルは独占ビジネスなので、その売上は、そのサービスの市場規模と同等になるまで高められる。
つまり、市場規模と同等だから、小さい国家のGDPよりもはるかに大きな利益を得ることも可能。

SaaSはB2Cのビジネスなので、顧客のフィードバックをすぐに取り込みやすい。
ランダム実験やABテストも実現しやすいので、サービスやビジネスモデルを仮説検証しやすい。
つまり、SaaSでは、念入りに考え抜いた計画を作って数年かけてリリースするよりも、仮設を立てたら、複数のサービスを同時リリースして、ランダム比較化実験でその効果を測定した方が速い。

興味深いのは、米国や中国では、SaaSのトッププレーヤーはB2Cなのに、日本の楽天やモノタロウなどはB2B2Cというスタイルで異なる点だ。
もちろん、LINEのように、日本国民の殆どとつながっていて、その連絡先とつぶやきのようなログデータを既に持っている会社はB2Cだ。
しかし、日本で目立つSaaSプレーヤーはB2Bのクッションを通過した後でB2Cを提供するビジネスモデルが多いように思える。
その理由は分からないので、いつか知りたい。

プラットフォーム革命の感想~プラットフォーム企業は新たな独占企業である: プログラマの思索

規模の経済と経験曲線効果のメモ: プログラマの思索

【5】SaaSでは、大量のログデータがビジネスの副産物として採取される。
データはいくらでもある。
そこから、機械学習やディープニューラルネットワークに大量データを食わせることで、優れたAIエンジンを生み出すことも可能だ。
B2Cのプラットフォームビジネスでは、ユーザの個人情報は特定できるし、その購買行動はプラットフォーム上で全て追跡できる。
よって、ペルソナを仮想的に作って、より購買を促すようなプロモーションを打ち出して、潜在ニーズを掘り起こせる。

「告発 フェイスブックを揺るがした巨大スキャンダル」によれば、Facebookで、個人に68個のいいねがあれば、その人物に関する非常に具体的な情報をモデルから予測できる。
70個のいいねで、そのユーザの友人が知るよりも、その人の多くの個人情報がモデルから推測される。
150個のいいねで、親よりも、その人の多くの個人情報がモデルから推測される。
300個のいいねで、パートナーよりも、その人の多くの個人情報がモデルから推測される。
さらにその多くのいいねを見れば、ユーザが自分自身について知っていると思っている以上の個人情報がモデルから推測される。
つまり、個人の大量のログデータを収集できれば、その個人を丸裸にできる。
その個人情報を他人が知っている情報だけでなく、その個人自身が知らない潜在ニーズまで推測できるわけだ。
すなわち、ジョハリの窓という理論は、AIを使えばほぼ完全に実現できる可能性があると思う。

(それを悪用したのが、ケンブリッジ・アナリティカであり、彼らは、どの個人にどんなプロモーションを送ればどんな選挙行動に移してくれるか、を徹底的に研究して、トランプ効果や英国のEC離脱を生み出したわけだが。)

そんなことを考えると、SaaSは機械学習やニューラルネットワークと非常に相性がいい。
だから、テスラみたいに製造業もどんどんSaaSにシフトしているのだろうと思う。

| | コメント (0)

2020/06/13

機械学習が抱える問題

機械学習(深層学習も含む)が抱える問題とは一体、何だろうか?
「scikit-learnとTensorFlowによる実践機械学習」を読みながら、考えたことをラフなメモ書き。
初心者のメモなので、間違っていたら後で直す。

【1】機械学習が抱える問題とは一体何だろうか?
機械学習の主要なタスクは、学習アルゴリズムを指定して、訓練データを元にモデルをFitさせること。
つまり、まずデータ、まずいアルゴリズムに問題の原因がある。

「scikit-learnとTensorFlowによる実践機械学習」で一番興味を惹いた点は、「複雑な問題ではアルゴリズムよりも大量のデータの方が重要になる」という考え方が論文で紹介されていることだ。
つまり、最適なアルゴリズムを考えるよりも、大量データを元に、統計アルゴリズムを駆使する方が、より良い最適解を得られることを意味する。
特に、ディープラーニングのように、特徴量を自動的に導出できる場合がそうだ。

つまり、天才が優れたアルゴリズムを考え抜くよりも、コンピューティングパワーに任せて、モデルに大量データを食わせてモデルを訓練する方が最短の解決方法になるわけだ。

しかし、インターネットが発明されるまでは、大量データを採取することすら難しかった。
またコンピューティングパワーも不足していた。
2010年代になってようやく、クラウドとGPUなどにより、大量データをいくらでも機械学習アルゴリズムに食わせることができるようになったわけだ。

特に、GAFAのように、BtoCのSaaSのビジネスモデルの場合、消費者の購買活動は全て手に入れられるので、ビジネスの副産物として大量データをかんたんに入手できる。
そして、そのデータは個人を特定できるデータなので、データの質もいいはずだ。

【2】機械学習の最大の難問は、過学習への対応方法だろう。
モデルが訓練データで良い性能を発揮しても、未知のデータである汎用データに対し性能が悪ければ、過学習に陥ってしまう。
つまり、モデルが訓練データにFitしすぎて、訓練誤差は小さいが、汎化誤差は小さく収束しないことを意味する。

過学習への対策としては、次元削減や交差検証などがある。
交差検証は、訓練データと汎化データの品質を保つような仕組みが組み込まれていて、よく考えられているなと思う。

次元削減は、高次元空間ではデータはスパース(疎)になりやすいという次元の呪いを解決するために、色んなアルゴリズムが作られている。
次元削減によって、特徴量を自動計算できて、シンボルグラウンディング問題を解決させるわけだ。

この辺りを考えると、昔、ソシュール哲学の本を読んだ時に何を言っているのか分からなかった時を思い出す。
プラトンのイデア論を言い換えれば、本来の真理ないし実体と、それを表現する記号や言語があり、記号や言語の背後には特徴量というイデアがあると思える。

【3】ディープニューラルネットワークの考え方は面白い。
畳み込みニューラルネットワーク(CNN)は画像認識、再帰ニューラルネットワーク(RNN)は時系列データに強い。

CNNでは、画像の一部の要素に反応して、それらを次元削減してどんどん特徴量にまとめあげていく。
人がぼーっと夕焼けや景色を見ている時、そういうアルゴリズムで見ていると思うと、何となく腑に落ちる。

特に、RNNが自然言語処理に強い、という意見が興味深かった。
RNNでは、LSTMという長短期記憶の概念が出てくるが、これは、TOEIC勉強で習った「retain(保持)」の考え方に似ている。
日本人は英語を返り読みする悪い癖があるのは、長文の英文にある単語をretainすることができないからだ。
つまり、文章の単語の前後を短期記憶して、すぐに取り出して意味を見出す訓練が足りない。
RNNはその仕組みを実現しているから、自然言語処理に向いているのだろう。

【4】深層学習を含む機械学習がいくつかの従来の問題を解決してきた現在、今後、深層学習は人間の知能により近づき、いつかは追い越すかも知れない。
カーツワイルは技術的特異点が2045年と主張した。
確かに、コンピューティングパワーが進化すれば、単純な作業は全てAI化されるだろう。

しかし、大量の訓練データでFitしたモデルは、人間の知能を本当に超えるのか?
気になる点は、そういうモデルが意識を持つのか、という点だ。

直近のディープニューラルネットワークのブームは、先カンブリア紀の生物大爆発に例えられる。
つまり、生物が眼を発明したことで飛躍的に進化し、その原型は作られた。
しかし、生物が意識を持ち、自ら文明を作り出すまでに、さらに5億年以上の歳月が必要だった。
そこから類推すると、ディープニューラルネットワークに後もう一つの発見や発明が必要な気がする。

強化学習や敵対的生成ネットワーク等のように、AIやロボットが自ら進化していく仕組みは提案されている。
でも、まだ何か足りない気がする。
それを考えるのも楽しい。

| | コメント (0)

2020/05/30

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

「人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書) 」がとても良かったので、感想をメモ。
ラフなメモ書き。

たまたま古本屋で「人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書) 」を見つけて立ち読みした。
2015年出版なので、内容は古いだろう、と勝手に想像していたら、ディープラーニングや機械学習の概念の比喩や説明が非常に分かりやすくて、良い本だった。

興味を引いたフレーズ、理解した内容は下記の通り。

人工知能は、飛行機の例と近い。
人は飛ぶために鳥の真似をするような羽ばたく飛行機を作ろうとして失敗した。
実際は揚力という概念を見つけて、揚力を得る方法をエンジンによる推進力で実現することで、工学的に解決できた。
同様に、人工知能も、人の脳みそを真似したとしても、実装方法は生物と同じようにやる必要はない。
人工知能でも、知能の原理を見つけて、それをコンピュータで実現すればいいだけだ。

機械学習は所詮、力任せに探索手順を全て探すアルゴリズムに過ぎない。
ただし、人工知能ブームを経ていくつかの成長がある。
一つは、膨大なデータを元に機械学習をさせると、より良い特徴量が発見できてきたこと。
たとえば、将棋ソフトの特徴量では、以前は2つの駒の関係だったが、3つの駒の関係を使った方が有効だと分かってきた。

2つ目は、スコア評価にモンテカルロ法を導入して、ある局面まで来たら、人間が重み付けで評価するのではなく、ランダムに数億手を探索させてスコアを評価させる。その中から良いスコアの探索手順を選ばせる方が精度が高い。
コンピュータによるシミュレーションで膨大に計算できるのだから容易いこと。

ニューロンの誤差逆伝播のたとえ。
ある組織の上司が判断を下す場面で、部下からの情報を元に判断を下す。
自分の判断が正しかった時、その判断の根拠となった情報を吸い上げた部下との関係を深めて、判断が間違った時はその間違いの原因となった情報を吸い上げた部下との関係を弱める。
これを何度も繰り返せば、組織として正しい判断を下す確率が上がる。
つまり、正しい判断材料が部下(下)から上司(上)へ上がる一方、修正を加える時は、上司(上)の判断の誤り(誤差)から部下(下)との関係の強さに修正を加えるので、誤差は逆伝播するわけ。

しかし、上司と部下の距離が遠すぎると、誤差逆伝播による修正の情報は届きにくくなる。
この比喩は、ニューラルネットワークの誤差逆伝播は、組織の情報伝達と似ていて非常にわかりやすい。

機械学習は、ニューラルネットワークを作る学習フェーズと、できあがったニューラルネットワークを使って正解を出す予測フェーズに分かれる。
学習フェーズの作業はとても時間がかかる一方、いったんニューラルネットワークが完成すれば、予測フェーズは一瞬で終わる。
たとえば、人間も学習している時は体得するのに非常に時間がかかるが、学習した成果を使って判断するのは一瞬だ。
それと事象は似ている。

機械学習の手法はいくらでもあるが、結局、いい特徴量を作るのが一番大変で、人間がやるしかないんですけどね、と先生から言われた。
つまり、特徴量をどうやって作るかが機械学習の本質である。
人間は特徴量をつかむのに長けている。

特徴量の話は、言語哲学者ソシュールの議論に似ている。
彼は、記号とは、概念(シニフィエ)と名前(シニフィアン)が表裏一体となって結びついたもの、と考えた。
たとえば、シニフィエは猫そのものであり、シニフィアンは日本語は「猫」、英語は「Cat」と呼ばれて、人はそれぞれ理解して運用されている。

コンピュータが特徴量を取り出したら、それは概念(シニフィエ)であり、そこに記号として名前(シニフィアン)を与えれば良い。
そうすれば、シンボルグラウンディング問題は解決される。
Googleがディープラーニングによって膨大な画像データから、猫の顔や人間の顔を判別できた、というのはそういうこと。

ディープラーニングは多階層ニューラルネットワークである、という意味が分かっていなかったが、ようやく分かった気がした。

ディープラーニングとは、特徴表現学習と呼ぶべきだ。

ニューラルネットワークで、3層からどんどん多層にすれば人間の脳みそに近づくのに、精度が上がらなかった。
原因は、深い層では、誤差逆伝播が下の階層まで届かないから。
つまり、組織の階層が深いと、一番上の上司の判断が良かったか悪かったかどうかが、末端の従業員に届く頃には、ほとんど影響がゼロになってしまうから。

ではディープラーニングではどうやって解決したのか?
ディープラーニングが従来の機械学習と大きく異なる点は2つ。
一つは、1階層ずつ学習すること、もう一つは自己符号化器という情報圧縮器を使うこと。

自己符号化器では、ニューラルネットワークの入力値と出力値を同じにする。
つまり最初は教師あり学習をさせる。
隠れ層は細くくびれているので、情報量を圧縮させて復元エラーが出ないような特徴表現を学習させる。

統計に詳しい人であればピンとくるだろうが、自己符号化器でやっていることは、アンケート分析結果でおなじみの主成分分析と同じ。
たくさんの変数を少数個の無相関な合成変数に縮約する方法。
実際、線形な重みの関数を用いて、最小二乗誤差を復元エラーの関数とすれば、主成分分析と一致する。
自己符号化器では、非線形な重み関数(シグモイド関数とか色々)を使い、復元エラーを最小にさせるだけでなく、様々な形でノイズを与えて非常に頑健に主成分を取り出す。
これにより、多階層にディープにでき、主成分分析では取り出せないような高次の特徴量を取り出せる。

「ディープにする」図23が非常にわかりやすい。
隠れ層を上に引っ張り出し、入力層と出力層は同じだから便宜的に重ねてしまい、隠れ層を2段目、3段目、と何段にも重ねればよい。

相関のあるものをひとまとまりにすることで特徴量を取り出し、さらにそれを用いて、高次の特徴量を取り出す。
人間がぼーっと目や耳から入った情報から、「お母さん」の概念を発見する仕組みも同様に実現できるはず。

なお、データから概念を作り出すというのは、本来、教師なし学習である。
ディープラーニングでは、教師なし学習を教師あり学習的なアプローチでやっている。

ところが少し難しい点は、そうして得られた特徴量を使って最後に分類する時、教師あり学習になることだ。
つまり、ディープラーニングは「教師あり学習的な方法による教師なし学習」で特徴量を作り、最後に何かを分類させたい時、「教師あり学習」になる。
では、ディープラーニングは教師あり学習をやっているなら、ディープラーニングの意義は小さいのではないか?
(ここは、僕にとっては一番難しい所)

だがこの違いは非常に大きい。
ディープラーニングによって得られた特徴量を使ってデータを判断する時の教師あり学習は、非常に高度なレベルなのだ。
「世の中の相関する事象」の相関をあらかじめとらえておく(つまり、特徴量で抑えておく)ことで、現実的な問題の学習は早くなる。
なぜなら、相関があるということは、その背景に何らかの現実の構造が隠れているはずだから。
つまり、世の中の2つの事象の関係に強い相関関係があるならば、その背後には、概念や意味のレベルで何かしら同一な概念が含まれているはずだから。

ディープラーニングは所詮、主成分分析を非線形にし、多段にしただけ。
とても単純な理屈。
しかし、考え方は単純であっても、こうした高次の特徴量や概念を取り出すには、非常に長時間の精錬の過程を必要とする。
つまり、特徴量の頑健性(ロバスト性)が必要。
すなわち、入力にノイズが多少あっても、ニューラルネットワークの特徴量による判断がぐらつかないレベルの頑健性が必要。

頑健性を得るには、ニューラルネットワークに過酷な環境を与えて、いじめ抜かないと、データの背後にある本質的な特徴量を獲得できないのだ。
画像認識の精度が上がらなかったのは、頑健性を高めるためにいじめ抜く作業の重要性(正則性)に気づかなかった為、そもそもマシンパワーが不足していた為だ。
それさえ気づけば、単純明快な話に過ぎない。

人工知能は本能を持つのか?
本能とは、快や不快を感じるかということ。
人間が獲得する概念の中には、復元エラーを最小化するだけでなく、何が快か不快かによって方向づけられてるものが多い。
ゲームや漫画、スポーツ、音楽など。
こうしたことは、人工知能では「強化学習」として知られている。
報酬を与えることで行動を方向づけて、その結果を生み出した行動を強化される仕組み。
強化学習で重要なのは、何が報酬になるのか、何が快や不快の基準になるのか?
人間は、生存に有利な行動が快、生存の確率を低くする行動は不快になる。
こうした本能に直結する概念をコンピュータが獲得するのは難しい。

この部分は、強化学習は今ホットな話題の一つ。
DeepMindのAlphaGoが以後の世界チャンピオンを破ったのは、強化学習にディープラーニングを取り入れたから。
たぶん、今後色々解決されていくはず。

強化学習の話は、昔習った教育学の話に似ている感じがする。
快や不快の基準は、マズローの欲求段階説における生存レベル、安全レベルの人間にとても当てはまるだろう。
つまり、貧しい人達の行動は、経済学の合理的人間説、強化学習のアルゴリズムにとても近い。
一方、低次の欲求が満たされて高次元レベルの人間になると、生存や金銭に関係なく、より複雑な行動を取るようになる。


| | コメント (0)