こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
今回の記事では、Practical Deep Learning for Codersという英語で学べるDeep Learning講座の第1章の感想を共有しながら、受講前と受講後で考え方が変わった点や、この講座のどのような点がおすすめかについてまとめていきたいと思います!
この講座は全文英語で展開されるものの、そのハードルさえ乗り越えてしまえば、図表やコードを使用して、数学が苦手な人でもディープラーニングについて理解できるようになるハイパー優れた無料講座なので、本記事を読んで興味を持った方はぜひ講義を受けてみることをおすすめいたします!
Practical Deep Learning for Codersとは?
Practical Deep Learning for Codersとは、プログラマーやエンジニア向けにディープラーニングとはどのようなことを行なっているのかを、極力数学の難しい部分には立ち入らずに、図やコードを使って説明してくれる英語の無料講座のことです。
しかも、Practicalとあるように理論的なディープラーニングの学習で終わるのではなく、実践の中でどのようなディープラーニングとはどのような仕組みになっているのか、現実の課題にどのように適用できるのかを探索していく、チャレンジングな講義内容となっています。
なお、私がこの講義を受講することになったきっかけはHugging Face CourseでTransformersについて学習をしようとしたら、Hugging Face Courseのイントロに「このコースはディープラーニングについて基礎的な理解があることを前提としているので、ディープラーニングについての基礎的な理解から始めたい人はPractical Deep Learning for Codersで学習してきてください」という書いてあったことが発端です。
講師は?
Practical Deep Learning for Codersは実際にYouTubeで講義動画を見ながら学習することができるのですが、担当講師はクイーンズランド大学教授のJeremy Howardです。
彼はマッキンゼー、A.T.カーニーでコンサルティング業務をしたのちに、最初期のKaggleに合流し、代表取締役兼チーフデータサイエンティストに就任したデータサイエンス界の創造神とも言える人物です。
YouTudeに公開されている講義動画では、そんなJeremy Howardがお茶目な笑顔をかましながら、Excelで回帰分析や協調フィルタリングをわっかりやすく解説してみたり、ディープラーニングがどのように機能しているのかを超スモールステップで解説したり、Stable Diffusionの仕組みについてお絵描きをしながら解説してくれたり、「これが無料でいいの?」というクオリティで授業をしてくれるので必見です。
講義で学べる内容は?
講義で学べる内容は以下の通りで、機械学習が初めての人でも基礎から学べる構成になっています。
- Getting started (さあ始めよう!)
- Deployment (デプロイしてみよう)
- Neural Net foundations (ニューラルネットの基礎)
- Natural Language(NLP) (自然言語処理)
- From-scratch model (一からモデルを作ってみよう)
- Random forests (ランダムフォレスト)
- Collaborative filtering (協調フィルタリング)
- Convolutions (CNNs) (畳み込みニューラルネットワーク)
授業で使用したコードは?
授業で使用したコードはKaggleもしくはGoogle Colab上で公開されているため、Kaggleに登録しているもしくはGoogleアカウントを持っていれば、環境構築を気にすることなく実際にJeremyが解説してくれる内容を手元で実行することができます。
授業に関連するKaggleのノートブックやGoogle Colabへのリンクはそれぞれの授業のページのResourses欄に記載があるので、授業用のノートブックにアクセスするのも容易です。
教科書は?
本講義のPart1はDeep Learning for Coders with fastai & PyTorchという英語書籍と対応しています。
そして、何と、本書はGoogle Colabを利用すれば無料で閲覧することができるのです。
またGoogle Colabということもあり、書籍内のコードも実行可能な状態となっているので、実際に実行をしたり、時にはコードを書き換えて挙動の変化を見ながら学習を進めることができます。
ここで一つポイントとなるのが、講義動画の内容と書籍の内容では同じトピックを扱っているにしても理解の進め方が微妙に異なることです。
これは講義動画内でJeremyも「ある習得したい事柄に対して、多様な学び方・関わり方をすることをより深い理解を助ける」と言及している通り、特に講義動画後の復習・記憶の定着としての使い方がおすすめです。
講義を受ける前の私の状態
この講義に受ける前は、ディープラーニングについてはPython機械学習プログラミング 達人データサイエンティストによる理論と実践で一通りの機械学習手法・ディープラーニング手法についてはコードを含めた実行したことがある、というレベルでした。
ニューラルネットで重みづけを行なっていることや誤差逆伝播法なる手法を使っていることは理解していたものの、実際にどうしてそれらを実行することで様々な要素を考慮したモデルが出来上がるのかについては真に理解できているとは言えない状態でした。
講義を受けた変わったこと
講義を受けて変わったこととしては以下の3つが挙げられます。
- ディープラーニングにおける学習がどのような仕組みで行われているのかが理解できた
- ディープラーニングでよく出てくる埋め込み(Embedding)に対する得体の知れない恐怖心がなくなった
- fastaiという使いこなせればかなり楽ができそうなライブラリに出会えた
順番に解説していきます。
ディープラーニングにおける学習がどのような仕組みで行われているのかが理解できた
今まではディープラーニングの学習について「誤差逆伝播法という手法を使ってパラメータを修正して学習している」という解像度の低い理解しかできていませんでした。
本講義では、上記の話に行く前に、スモールステップに分解した上で懇切丁寧に説明を進めていきます。
全体としては以下のような手順を辿ります。
- 機械学習の用語について確認する
- それぞれの用語を使って、「誤差を小さくなる方向にパラメータを調整する」という機械学習の根本に通じる概念を説明する
- 実際にExcelで線形回帰モデルを構築してみる(初期パラメータはランダム)
- 線形モデルを2層重ねてニューラルネットワークモデルを構築する
- ディープラーニングのように多層になった場合はどのように「誤差」を小さくすればいいかを考える
- 勾配降下法で誤差が小さくなる方向に進む方法は「傾きを求めて(=微分)、その逆を引き算する」であったことを図を使って確認する
- 多層の場合も微分の多次元版、勾配を計算して、その値に学習率をかけた値を引き算することによってパラメータを更新する(=誤差逆伝播法)
※もし上記記述が間違っていたらJeremyではなく、私の理解が悪いのでコメントいただけると幸いです…
というように、機械学習の初歩のところから、少しずつ少しずつ論理を積み重ねて、最終的にディープラーニングがどのような仕組みで学習をしているのか理解できるところまで導いてくれるのがJeremy教授の講義なのです。
ディープラーニングでよく出てくる埋め込み(Embedding)に対する得体の知れない恐怖心がなくなった
今までは埋め込み(Embeddiing)や畳み込み(Convolution)と聞くと、「ゲッ、またややこしい言葉が出てきた…」と苦虫を潰したような顔になっていた私ですが、Jeremy教授の協調フィルタリングの講義とCNNsの講義を受けて、「なんだ、ただのベクトルと行列の積の結果じゃん」とその言葉の真意が分かるようになりました。
「顧客の映画の評価から、どのようにして顧客の映画の嗜好と映画のジャンルとしての要素を求めるのか」という協調フィルタリングの解説をExcelを使って行っていたのですが、初めて協調フィルタリングついて学習した私にとっては衝撃を受けるぐらいに解説が分かりやすかったのです。
「結果として求められた顧客の嗜好のベクトル、映画のジャンルとしての要素のベクトルがEmbeddingです」と言われた時には「え!そんなことだったの!」とこれまた分かりやすさに驚愕しました。
CNNsについても協調フィルタリングの話ですっかり行列積の計算に慣れていたので、 CNNにおける各ピクセルとカーネルの積を求める話にしても、「そりゃ次元が小さくなるわけだわ」と納得の嵐でした。
fastaiという使いこなせればかなり楽ができそうなライブラリに出会えた
講師のJeremyはfast.aiという機械学習・ディープラーニングのための処理を短いコードで実行できるようにまとめてあるPythonライブラリの開発者でもあります。
そのため、本講義にはプログラムの中身には立ち入らずに、結果としてどのような分析を行うことができるのかを受講者に教えたいときにfast.aiが頻繁に登場します。
それによって、プログラムの中身などその時々では気にする必要のないことを一切気にせずに、そのアウトプットを見ながら機械学習やディープラーニングによってどのようなことができるのかの理解を進めることができるのです。
例えば、以下のコードを実施するだけでRESNET34という画像処理の事前学習済みモデルに転移学習をさせて、ワンニャン判別機を作ることができます。
from fastai.vision.all import *
path = untar_data(URLs.PETS)
files = get_image_files(path/'images')
def label_func(f): return f[0].isupper()
dls = ImageDataLoaders.from_name_func(path, files, label_func, item_tfms = Resize(224))
learn = vision_learner(dls, resnet34, metrics = error_rate)
learn.fine_tune(1)
learn.show_results()
関数名も非常に分かりやすいため、
「あ、ここでファインチューニングしてるんだな」
「これは名前からして学習機だな、ここにデータと事前学習済みモデルを入れているんだな、評価指標はエラー率か」
と理解を進めることができます。
今後取り組みたいこと
私が今後取り組みたいこととしては以下の4つがあります。
- Practical Deep Learning for CodersのChapter2の学習を進める
- Hugging Face Courseを完走する
- 何らかの機械学習プロダクトをWebアプリベースでリリースする
- Practical Deep Learning for CodersのChapter1でJeremyから出されている宿題を実行する
Jeremyは講義内でも「実行こそが最大の学習である」と主張しており、授業の終わりごとに自分自身で授業で得た知識を使って何らか作ってみることを推奨していました。
私も授業後に「醤油ラーメン判別機」をHugging Spaceで作ってみたのですが、モデルの作成からデプロイまで様々な試行錯誤をし、多くの学びを得ることができました。
後半2つのアウトプット目掛けて、前半2つのインプットを行っていきたいと考えています。
まとめ
今回の記事では、Practical Deep Learning for Codersという英語で学べるDeep Learning講座の第1章の全体感を眺めながら、講義受講後の変化とこれから取り組みたいことについてまとめました!
Chapter2はChapter1と比べて少し難易度が上がる(とはいえChapter1の内容から大きく飛躍するということはない)のですが、Stable Diffusionの仕組みなどの最新事例についても学ぶことができるので、Chapter2についても完走した暁にはレビューを書きたいと思います!
ディープラーニングを基礎から理解したい方はぜひ受講してみてください!
コメント