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

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)

2020/05/28

次元の呪い

機械学習に出てくる「次元の呪い」をリンクしておく。

機械学習と次元の呪い | TechCrowd

(引用開始)
次元の呪いとは
大量のデータを分析する時は大きな次元のデータの処理をする事が多くなりますが、次元数が大きくなると次元の呪いと呼ばれる問題が発生する事に注意しなくてはなりません。
次元の呪いとは、データの次元数が大きくなり過ぎると、そのデータで表現できる組み合わせが飛躍的に多くなってしまい、その結果、手元にある有限なサンプルデータでは十分な学習結果が得られなくなることを指しています。
ビッグデータを処理するためのコンピュータシステムを用意している場合でも、機械学習でデータを処理する場に、次元の呪いに注意しないと、計算コストが莫大となるだけでなく、十分な学習結果が得られず、未知のデータに適切に対応出来なくなる等の不具合が発生してしまいます。
(引用終了)

次元の呪いについて - Qiita

(引用開始)
超球をメロンパンに例えています。高次元空間においては、「皮」に相当する部分が体積の殆どを占めるようです。
3次元では皮の体積が3%であるのに対し、500次元では99.3%が皮になります。とても不思議です。
(引用終了)

高次元空間では、任意の相異なる点同士の距離はかなり疎になる。
つまり、高次元空間では、皮に相当する部分にデータが集まっている。
距離が離れると、予測の信頼性は大幅に下がってしまう。
訓練データの次元が多いほど、過学習のリスクが高くなる。
だから、次元削減のための手法がいくつか生み出されているストーリーらしい。

人間は3次元までしか認識できないので、1000次元空間の中の200次元曲線なんてイメージできない。
絵も書けないから、数式からそのイメージを沸かせるしかない。


| | コメント (0)

2020/05/27

Python と R の違いのリンク

PythonとR言語の違いについて興味を持ったのでメモ。

【参考1】
Python と R の違い・関数の対応表 ? Python でデータサイエンス

基本ライブラリやデータ分析に関する処理の違いをコードベースで書いてくれているので読みやすい。

Python と R の違い (データフレーム編)
Python と R の違い (数学関数・データ整形加工編)
Python と R の違い (日付・時間の処理)
Python と R の違い (データ可視化・グラフ作成編)
Python と R の違い (決定木分析)
Python と R の違い (サポートベクターマシン)
Python と R の違い (ナイーブベイズ分類器)
Python と R の違い (ランダムフォレスト法)
Python と R の違い (線形回帰による予測)
Python と R の違い (k-NN 法による分類器)

PythonとR言語のコードを比較しながら読んでいると、まるで、ロゼッタストーンを発見した時に、古代エジプト語とアルファベットを比較したような感覚に似ているのかな、と空想したりする。
つまり、同じ内容を表現する時に、全く違う言語で表現したら、見た目が全く違う、みたいな感じ。

【参考2】
PythonとRのコマンド比較表 - Qiita

データフレーム、プロット、リスト、計算、処理などの観点でコード比較している。
Numpy、Pandas、Matplotlibに相当するRのライブラリは自分でも整理してみる。

【参考3】
R vs Python:データ解析を比較 | POSTD

実際にデータ分析したいことについて、PythonとRで比較している。
Pythonは、scikit-learnみたいにライブラリを使いまくるイメージかな。

一方、Rの方がPythonよりも行数を短く書ける場合もあるみたい。
この辺りは、自分で書いてみて理解する。

Haruhiko OkumuraさんはTwitterを使っています 「https://t.co/fxE6ETowKd Rで書けば5行だ df = read.csv('...') plot(df$costs, df$profit) r = lm(profit ~ costs, data=df) summary(r) abline(r)」 / Twitter

【参考4】
「データ分析をやるならRとPythonのどちらを使うべき?」への個人的な回答 - 渋谷駅前で働くデータサイエンティストのブログ

このブログを読むと、試行錯誤しながらデータ分析するならR言語、機械学習や深層学習ならPython、という使い分けなのかな。

ちょっとずつ書いてみると違いが分かり始めて面白い。


| | コメント (0)

2020/05/10

乱立したPythonのオライリー本のリスト

Python本が読みたいと思っていたら、オライリーの本が大量に出版されていたので、下記の記事をメモ。

オライリーのPython & 機械学習本が渋滞気味なので整理してみた - Deutschina's Tech Diary

自分が読みたい本をリストアップしておく。

NumPy、Pandas、MatPlotLibを一通り勉強する時の本。

DeepLearningの構造を最初から理解する。

「scikit-learnとTensorFlowによる実践機械学習」は今読んでるけど、機械学習が今までのアルゴリズムと何が違うのか、網羅的に書かれていてとても役立つ。

これもいつか読みたい。


| | コメント (0)

2020/04/29

「ゼロから作るDeep Learning」を読み始める

「ゼロから作るDeep Learning」を読み始めた。
一気に7章まで読んだ。
理論とPythonの実コードを行ったり来たりする説明がとても素晴らしい。
思いつきをメモ。

【参考】
ゼロから作るDeep Learningのメモまとめ - Qiita

ゼロから作るDeep Learningで素人がつまずいたことメモ: まとめ - Qiita

以前から、機械学習やら深層学習に関する本は斜め読みで乱読してきた。
また、統計検定やQC検定の資格勉強を通じて、実際に使う統計理論と、メーカーによる品質管理の事例のイメージは分かっていた。
だから、理論の部分はだいたいイメージできていた。
でも肝心のソースが今まで分からなかったので、ブラックボックスみたいなイメージだった。

PythonもNumpy・Pandas・MatPlotlibもある程度慣れたおかげで、Pythonのソースコードを読みながら、なるほど、こんなアルゴリズムで作っているのか、割とベタベタにプログラムを書いているんだな、とか、色々気づきがあった。
Githubのソースコードを実際に動かした後で、本の文章の行間に書かれている内容を想像するのが楽しい。

oreilly-japan/deep-learning-from-scratch: 『ゼロから作る Deep Learning』(O'Reilly Japan, 2016)

Githubのソースを動かす時は、下記を参考にした。

Jenga 妄想の大気開放  オライリーの『ゼロから作るDeep Learning」でMNISTデータセットが読み込み出来ない件(Windows10上で動作するeclipseにて)

まだまだ分かってないけれど、いくつか気づきはある。

0か1を返す関数の引数にNumpyデータを渡した時、そのままでは計算できないが、Numpyのトリックを当てはめて解決する。つまり、np.arrayの要素に不等号演算を渡し、np.int型を返すようにする。
この部分は上手いなと思った。

パーセプトロンの合成は行列の積と同値なので、Numpyライブラリが有効に使える。
よって、行列の成分が膨大な個数であっても演算の個数自体はそれほど増えるわけではない。

実際のPythonの計算式では、かなり大きな数同士で四則演算する場合にオーバーフローの問題が出やすいとか
無限大に近い数値が出てしまう時がある。
そこで、あるMax値を付与したり、微小値を式に付与したりする場合がある。

ディープラーニングのような学習プログラムは、学習効率をいかに上げるか、という観点で損失関数をバロメーターにしてその精度を評価する。
これは丁度、小中高校生の学習でも、少ない学習時間でいかに暗記できたり、理解できるか、という観点にもつながる。
つまり、コンピュータの学習も人間の学習も、そのアルゴリズムは同じように思える。
多分そのように思える理由は、深層学習がそもそも人間の脳をパーセプトロンで表現してコンピュータ上でシミュレーションできるようにしたのだから、トートロジーなのかもしれない。

教師あり学習は、今のようなビッグデータと言われる時代では、非常に有効なのだろう。
SaaSで自動的に収集できるログデータ、電気自動車や家電製品から集まるデータなど、現代ではビジネスの副産物としていくらでもデータを集められるので、そのデータを使えば、いくらでも機械学習や深層学習エンジンに食わせることはできる。

強化学習の考え方を深層学習エンジンで実装するアイデアは面白いと思った。
強化学習はエージェントに報酬を与えることで、試行錯誤させながら学習させて賢くさせる。

この考え方は、組織人事理論にある「期待理論」の考え方に似ている。
期待理論では、動機付けの強さは「報酬への期待x報酬への魅力」「期待x誘意性」で決まると考える。
よって、期待理論を実際の組織に当てはめた場合、利益分配制度のような変動給与制、業績連動制度、成果主義人事制度を構築することで、社員の動機を誘発し、誘導させる。
なお、昨今の人事制度構築でも期待理論は非常に有効な考え方と言われている。

つまり、強化学習の考え方は、従来の組織人事理論の期待理論の考え方を適用し、実際にPythonプログラムで実装したに過ぎないように思える。
この考え方を発展させれば、機械学習や深層学習の学習効率を上げたいと研究したいならば、組織人事の理論を片っ端からPythonで実装して、比較すればいいだろう。

もう少し理解できたらまとめてみる。


| | コメント (0)