2lu3のエンジニア技術アウトプット

AI,深層学習,機械学習,RescueSimulation,RoboCupJunior,neovimについて解説しています

機械学習についてのなぐり書き

AIについて僕が持っていることについてまとめます。

言語・ライブラリ

言語

Pythonが非常に有名かつ主流

RubyやGoで機械学習をするという話も聞いたことはある

ライブラリ

  • TensorFlow
    • Google
    • PyTorchと同じくらい使われている
  • PyTorch
    • Facebook
    • TensorFlowと同じくらい使われている
  • Keras
    • TensorFlow、CNTK、Theanoのラッパー
    • Kerasの本家と、TensorFlowにカスタマイズしたKerasがある
    • TensorFlow使うなら、TensorFlowのKerasを使うと良い

実行環境

Colaboratory

自前のGPU/TPU用意するより、Colaboratoryのほうが便利

本業で機械学習やる場合はまた別

有料版のColaboratory Proもある

GPU・TPU

TPUは小数の計算の精度を犠牲にして速くしている

迷ったらTPU使えば良い

TPUの凄さは、記事にもなっている。

Google ColaboratoryのTPUを試してみる

機械学習の手法

(狭義の)機械学習

機械学習の手法を挙げます。

LightGBM

LightGBM 徹底入門 – LightGBMの使い方や仕組み、XGBoostとの違いについてがわかりやすい。

非常によく使われていて、しかも奥が深い。

分析問題に対しては、後述する深層学習よりも精度が上になることが多い。

XGBoost

LightGBMより前に開発されたLightGBMと同じようなもの。 初心者に限って言うなら、XGBoostを使うならLightGBMを使ったほうが良さそう。

sklearnのモデル選択方法

状況に合ったモデルを選ぶための図 割と参考になる

  • classification

    • 教師あり学習・分類
    • 予め、このデータはAというように分類されている
    • 例:写真を入力したら猫か犬か判定するAI
  • regression

  • clustering

    • 教師なし学習・分類
    • データが与えられ、そのデータを分類する
    • K-means法とかが有名
  • dimensionality reduction
    • 次元削減
    • データの特徴を、より少ないバイト数で表現できるようにする
    • 深層学習の中間層を用いて次元削減するという話を聞いたこともある

Move mouse over image

引用元サイト

深層学習(ディープラーニング)

画像認識など、分析以外のタスクが得意

分析問題を解くときも、アンサンブルとして使うことが多い

深層学習で使う関数たち

詳しくは、絵やグラフつきのサイトがわかりやすい。

  • 最適化関数
    • 学習の進め方を決める関数
    • Adam, RMSpropなど
  • 活性化関数
    • 一つ前の層からきた値を、出力するために使う関数
    • sigmoid, tanh, relu, softmaxなど
      • softmaxは分類のときに出力層に使うことが多い
    • Kerasの公式ドキュメントにいろいろな活性化関数がある
  • 損失関数
    • 目標とする出力との違いを数値化する関数
    • この関数の値をもっとも小さく(または大きく)するように学習が進む
      • 学習の方向は最適化関数が決める
    • 基本的な使い分けはこのサイトがわかりやすい
  • 評価関数
    • 深層学習では、1度だけではなく、何度も何度も学習を繰り返す
    • 1回の学習ごとに今のスコアを表示する
    • 評価関数は学習自体には何の影響もない
      • 人間が、学習中もスコアを確認できるようにしているだけ
    • 損失関数は計算したスコアを学習に利用するが、評価関数は計算したスコアを学習に使わない
      • つまり、評価関数と損失関数はほぼ同じもの
    • accuracy, f値などがある
      • accuracyは複数ラベルの分類には使えない

深層学習でのパラメーター

  • batch size
  • ニューロン数(ノード数)・隠れ層数
    • 小さすぎると精度は低くなる
      • モデルが、データセットの複雑さに対応するだけのキャパシティがない
    • 大きすぎると精度は低くなる
      • モデルが大きすぎると、非常に複雑なデータセットに対応できる
      • 逆に、データ一つ一つに対して過学習する
      • イメージとしては、
        • 目標:画像を猫と犬に分類する
        • 理想:猫耳があれば猫、犬耳があれば犬と判定する
        • 現実:この生き物は猫、この生き物は犬と判定する
      • つまり、データの共通の部分を見つけなくても、このデータはこうだ、とおぼえてしまうだけのキャパシティを持つ
  • Drop Out
    • 過学習を防ぐために使う
    • 0.25~0.5ぐらいがよい

GAN(敵対的生成ネットワーク)

  • 本物そっくりの画像を生成する人工知能 Aさん
  • Aさんの画像と本物とを見分ける人工知能 Bさん

Aさんは、Bさんを騙せるようにがんばります

Bさんは、Aさんに騙されないようにがんばります

お互いに切磋琢磨しあって、結果的にAさんの生成した画像は本物と見分けがつかないレベルになります

詳しい説明は下の参考サイトに譲ります。

参考サイト:今さら聞けないGAN(1)基本構造の理解

その他

アンサンブル

複数のモデルを使って最終的な出力を出すこと。

例えば、LightGBMとディープラーニングなど

Optuna

ハイパーパラメータチューニングを自動で行ってくれます

かなり便利です

学習手段

  • Kaggleで勝つ!
    • とりあえず読む
  • 詳解 ディープラーニング
    • Tensorflow1.0のときのものなのであまり...
    • 内容は詳しいし、わかりやすい
  • Androidアプリ開発の教科書
    • 基本的なやり方がよく分かる
    • Androidアプリを作り始める人にはオススメ
    • 実践的にアプリを作ろうとすると足りない
  • Cクイックリファレンス
    • 辞書的な使い方で役に立つ
    • メジャーアップデートが来るとかいう噂を聞く
  • C言語総合講座15講
    • 理論編しか読んでいないが、下のprogramming place plusで足りない知識が身についた
  • プログラミングコンテストチャレンジブック
  • プログラミングの宝箱 アルゴリズムとデータ構造
  • アルゴリズムデザインアルゴリズムイントロダクション
    • アルゴリズムの辞書
    • 初めて読んだとき、両方とも数学の知識がないと手も足も出なかった(当時中3)
    • それ以来読んだことはない
  • 理科系の作文技術
    • 論文だけでなく、文章を書く上で非常に役に立つ
    • 絶対読むべき
  • 数学文章作法
    • 数学ガールの人が著者らしい
    • こちらも理科系の作文技術と同じくらい読んだほうが良い

サイト

全体

  • Qiita
    • 困ったらここに行けばいい
  • Teratail
    • エンジニア版のyahoo知恵袋
  • Progate
    • プログラミング初心者が学ぶのには良いと思う
    • 既に他の言語をマスターしていて、新しく言語を学ぶには冗長すぎる

Android

  • 公式リファレンス

    • 正確で手厚いが、情報量が多いので慣れるまでは解説サイトを見たほうが良い
  • nyan のアプリ開発

    • メジャーな機能についてはだいたい解説されている
    • サンプルコードもほとんど動く

Python

  • 検索するとだいたい出てくる
    • 特定のサイトを使うことはあまりない

C/C++

Kaggle

コミュニティ

  • kaggle-ja@slack
    • kaggleのコミュニティで、初心者が簡単に質問できる