grbl1.1+Arduino CNCシールドV3.5+bCNCを使用中。
BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。
その他、電子工作・プログラミング、機械学習などもやっています。
MacとUbuntuを使用。

CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:



*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。


ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示
ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示

2017年11月10日金曜日

Google AIY Voice Kit(Pimoroni)到着

一ヶ月ほど前にPimoroniに注文していたGoogle AIY Voice Kitが到着(26.33ポンド/約4000円:送料込み)。いわゆる音声認識キットで、元々は雑誌MagPi(57号/2017年5月)の付録です。当初はあっという間に売り切れてしまい、その後Ebayなどでも1万円くらいの高値がついていました。以前、ESP8266とWeb Speech APIで音声認識スイッチをつくっていたときも入手困難となっており諦めていましたが、ちょっと前に再販したようで一ヶ月ほど待たなければいけない予約販売でしたがついつい買ってしまいました。
現在Pimoroniではもうすでに売り切れのようですが、日本のKSYでは11月末以降に入荷されるようです(3000円/税抜き)。

中身はこんな感じ。75ページもあるカラー小冊子マニュアル。Web上ではAIYのサイトであるここにマニュアルがあります。
1時間もあれば一通り試すことができそうですが、個人的には音声認識に対する興味はやや失せてしまっており、まだやる気が起こりません。あと、Googleを使わなければいけないというのも、やや面倒。

この丁寧に説明されているマニュアル(冊子)を見ると面白そうですが、最近ではGoogle Home mini(6480円)、Amazon Echo Dot(5980円)、Anker Eufy(4980円)という小型で安価なスマートスピーカーも登場してきたので、このAIY Voice Kitを買うまでもないかも。たしかに微妙なところ。しかし、いろいろ試したりするにはいいのかもしれません。製品よりはHackしやすいはず。

AIY Voice Kitの紹介動画。

基本的にはGoogle Cloudのアカウントをつくり、Google Assistant SDKを通して、ラズパイに書いたPythonスクリプトで動かすようです。以下のサイトにはサンプルなどがあるので、Pythonで任意のプログラムを書き換えればいろいろ応用はできそうです。
Googleにとっては、Google Cloudを使ってもらう切っ掛け(宣伝)としてはいいのかもしれません。
そのうち気が向いたら組み立ててみようと思います。

2017年11月1日水曜日

Coursera: Convolutional Neural Networksコース開講

ようやくCouseraのDeep Learningシリーズのコース4であるCNN(Convolutional Neural Networks)が開講したようです。

以前コース1〜3までは受講してしまい、その続きとなります。UdemyのCNNコースで一通り学びましたが、復習も兼ねてやってみようかと。再登録というかたちになるのですが、料金($49)を支払ってのenrollというよりは、単なる聴講というかたちで覗いてみることにしました。聴講(無料)でも、講義の動画やプログラミング課題まではアクセスできるようです。ただし、字幕はまだ英語のみ。

CNNコースは:
Week1: Foundations of Convolutional Neural Networks/動画106分
Week2: Deep convolutional models: case studies/動画99分
Week3: Object detection/動画84分
Week4: Face recognition & Neural style transfer/動画79分

という構成になっており、各Weekでクイズやプログラミング課題があるようです。
後半の物体検知/顔検知/スタイル変換は面白そうです。

早速Week1の動画から見てみました。最初はConvolutionの基本原理となる、フィルター、パディング、ストライド、valid/sameなどの説明です。スタンフォード大のCS231n授業動画でも学べますが、やはり定評あるAndrew Ng先生の場合は丁寧に教えてくれます。抜け落としていた知識を補うためにもちょうどいい感じです。
実際コーディングする場合は、conv2d()などの関数を使えばすぐに実装できるのですが、Week1の最初の課題では、numpyを使ってフルスクラッチでConvolutionレイヤーを実装するようです。一旦仕組みを理解するにはよさそうです。2個目の課題からはTensorflowの関数を使っているので、より現実的な実装の仕方を学んでいくのだと思います。
Week2からのプログラミング課題はkerasを使うようです。

今後開講されるコース5:Sequece Modelでは、RNNやLSTMを学ぶようです。スタンフォード大学のCS230という授業がこのCourseraのコースと連携しているので、CS230のシラバスをみると、コース5は11/27以降というスケジュールになっています。

2017年10月28日土曜日

データセット:CIFAR-100の読み込み/tflearn DCGAN

引き続きDeep Learningの画像生成GAN(Generative Adversarial Network)について、いろいろ試しています。最近では3DデータのGANもあるようです。このThe GAN ZooというところにはいろんなGANがのっていますが、とりあえずは、鮮明な合成画像をつくりだすことが可能なDCGAN、そして一方の属性を他の属性へ合成するDisco GANなどを試そうと思っています。

GANの前にVAEの学習:
GANを勉強するためには、その前にVAE(Variational Autoencoder)を理解したほうがいいということで、ここしばらくはVAEを勉強していました。VAEを学ぶ前には、Autoencoderというアルゴリズムがあり、それは簡単な仕組みなのですが、VAEになるとかなり難しい概念が登場してきます。

・Autoencoder:簡単なエンコード/デコードのアルゴリズム
・VAE:正規分布、ベイズ推定、変分ベイズ、KLダイバージェンスなどの知識が必要

VAEの場合、途中で確率分布に置き換えるという手法が特に難解だったのですが、そういう手法をとることで、デコード(生成や再現)が可能となるというのは、なかなかの発見でした。その他の生成モデルにおいても確率分布を使うことがあるので、このあたりの手法はある程度理解しておいたほうが後々役に立ちそうです。

ということでVAEも面白いのですが、そろそろGANに移行しようということで、いろいろサンプルを物色していました。主にはTensorflowを使っていますが、最近のGANのソースはPytorchで書かれているものも多く、Kerasなども含め比較的シンプルに書けるライブラリが増えてきたようです。tflearnというTensorflowをシンプルにしたライブラリもあり、かなり短いコードで書くことができます。

tflearnでDCGANを試す:
tflearnのexamplesにあるdcganのサンプルはたった138行しかないので試してみました。しかし、このサンプルはこのままだとエラーがでるようで、この訂正のページ(dcganの欄)にあるように102、103、110行目の最後に「,2」を追加する必要があります。訂正すれば動くのですが、このdcganのサンプルも相変わらずMNIST(手書き文字)であり結果はあまり面白くはないです。せっかく画像生成のアルゴリズムなので、もう少し面白い画像を使ったほうがいいのですが、気の利いたデータセットがないというのが現状でしょうか。前回Udemyのコースで試したCelebA(セレブ顔画像) ならまだましかもしれません。

データセットについて:
他にデータセットはないかと探してみましたが、こちらに詳しく書かれています。
MNIST:手書き数字、70000(Tr:55000/Vl:5000/Te10000)、白黒、28x28px、
CelebA:セレブ顔、202600、カラー、178x218px
CIFAR-10:10クラス、60000(10x6000)、カラー、32x32px
CIFAR-100:100クラス、60000(100x600)、カラー、32x32px
Fashion MNIST:洋服/靴/鞄など10クラス、60000+10000、グレー、28x28px
ImageNet:未登録のため画像ダウンロードはまだ使えない(そのうち)
Google/Open Images:膨大すぎてつかいにくそう(そのうち)

すぐにダウンロードして使えそうなのは、それほどない。プログラムを書いてWebからスクレイピングする方法もあるかもしれないけれども、数万単位でのイメージが必要そうなので、個人で集めるには面倒。いまのうちからコツコツ集めておけば、かなりの価値になるにかもしれないけれども。
以下はCIFAR-10(10種類のクラス)。


CIFAR-100をダウンロード:
ということから、今回はなんとなく無難なCIFAR-100を試してみることに。こちらの記事を参考にスクリプトを書いてみました。データはCIFARのサイトにあるCIFAR-100 Python versionをダウンロードしました。解凍すると、そのまま画像が出てくるわけではなく、各画像はすでに1次元のデータになっているようです。ニューラルネットに画像データをインプットするならそのまま1次元がいいとは思いますが、必要に応じて2次元(3チャンネルカラー)に変換したり、あるいはグレースケールに落としたりすることもあります。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os

def unpickle(file):
    import cPickle
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo)
    return dict

def get_cifar100(folder):
    train_fname = os.path.join(folder,'train')
    test_fname  = os.path.join(folder,'test')
    data_dict = unpickle(train_fname)
    train_data = data_dict['data']
    train_fine_labels = data_dict['fine_labels']
    train_coarse_labels = data_dict['coarse_labels']

    data_dict = unpickle(test_fname)
    test_data = data_dict['data']
    test_fine_labels = data_dict['fine_labels']
    test_coarse_labels = data_dict['coarse_labels']

    bm = unpickle(os.path.join(folder, 'meta'))
    clabel_names = bm['coarse_label_names']
    flabel_names = bm['fine_label_names']

    return train_data, np.array(train_coarse_labels), np.array(train_fine_labels), test_data, np.array(test_coarse_labels), np.array(test_fine_labels), clabel_names, flabel_names

def get_images(name):
    tr_data100, tr_clabels100, tr_flabels100, te_data100, te_clabels100, te_flabels100, clabel_names100, flabel_names100 = get_cifar100("../large_files/cifar-100-python")
    #print(clabel_names100)
    images = []
    for i in range(len(tr_flabels100)):
        if tr_flabels100[i] == flabel_names100.index(name):
            #im = tr_data100[i].reshape(3,32,32).transpose(1, 2, 0) #(32,32,3)
            im = tr_data100[i].reshape(3,32,32)
            im = im[0]/3.0 + im[1]/3.0 + im[2]/3.0
            images.append(im)
    return images

これをutil.pyなどと保存して、先程のtflearnのdcganサンプルで使ってみました。ある特定のジャンルを学習できるように、ラベル名に対応した番号のみを読み込むということにしています。元画像はカラーですがグレースケールに変換しています。
get_images('bicycle')
とすれば、自転車の画像だけ合計500個読み込むということです。
ちなみにCIFAR-100の場合、clabel_names100という20種類の大きなクラスとflabel_names100というさらに細かい100種類のクラスに分かれているようです。
flabel_names100[9] = 'bicycle'
という関係なので、
tr_data100[9]
が、ある自転車の画像となります。画像はランダムに配置されているようで、forループである特定の種類の画像を抜き出すようにしています。
以下が、CIFAR-100のクラス。

clabel_names100 = [
'aquatic_mammals', 'fish',
'flowers', 'food_containers',
'fruit_and_vegetables', 'household_electrical_devices',
'household_furniture', 'insects',
'large_carnivores', 'large_man-made_outdoor_things',
'large_natural_outdoor_scenes', 'large_omnivores_and_herbivores',
'medium_mammals', 'non-insect_invertebrates',
'people', 'reptiles',
'small_mammals', 'trees',
'vehicles_1', 'vehicles_2']

flabel_names100 = [
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle', 'bicycle', 'bottle',
'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel', 'can', 'castle', 'caterpillar', 'cattle',
'chair', 'chimpanzee', 'clock', 'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster', 'house', 'kangaroo', 'keyboard',
'lamp', 'lawn_mower', 'leopard', 'lion', 'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain',
'mouse', 'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear', 'pickup_truck','pine_tree',
'plain', 'plate', 'poppy', 'porcupine', 'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket',
'rose', 'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake', 'spider',
'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table', 'tank', 'telephone', 'television','tiger',
'tractor',
'train', 'trout', 'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm']

全体では60000イメージあるのですが、一つのクラス(種類)は500個のイメージしかなく、Disco GANのように何か特定のジャンルを学習させようとすると画像数が足りなさすぎというのを後から気づきました。CIFAR-100はいろんな種類の画像があるかわりに画像数が少ない。CIFAR-10なら一つの種類で画像が6000あるので、まだましかもしれませんが、10種類しかジャンルがない(選びたいジャンルがない)。というわけで、思い描いているようなものを学習させて、それらを合成させたいということがなかなかできません。あくまで、すでに用意されている範囲でのジャンルを使って、試すということくらいしかできないというのが現状。

Deep Learningを実験していくには、数学を含めたアルゴリズムの勉強だけでなく(特にベイズ推定をつかった確率論的モデルなどが面白そう/今後より重要になっていくらしい)、データセットについても揃えなければいけないという難問があり、さらにはこのような画像生成をするなら、GPUマシンも必要という感じで、やはり先に進めば進むほど敷居が高くなってきます。段々面白くはなってきたけれども、色々面倒なことも増えてきました。

ベイズ推定については、この動画も面白い。今までの固定的な考え方が変わりそうな感じです。

変分ベイズ学習 (機械学習プロフェッショナルシリーズ)
Posted with Amakuri at 2017.10.29
中島 伸一
講談社
販売価格 ¥3,024

2017年10月13日金曜日

Udemy: GANs and Variational Autoencoderのコース

前回まではConvolutional Neural Networks(CNN)をやっていましたが、GANが気になるのでそちらのコースも受講してみました。CNNのほうはもう少し復習する必要があるのですが、このへんになるとどれも難しいので、とりあえず一番興味あるGANを先回りしてやってみようという感じです。


このUdemyのGANコースでは、前半にオートエンコーダーを学びます。前回のConvolutional Neural Networks(CNN)では元画像を畳み込んで圧縮したりフィルターをかけていましたが、畳み込みはせずにニューラルネットでエンコードすることを実験し、最終的にはエンコードされた画像を再現するようなデコード技術を学びます。画像補間処理のようなものですが、混合ガウス分布というまたもや数学的に難しい内容がでてきます。このあたりの処理になると、確率分布や乱数を使って複雑な方法で画像再現していくようです。一回見ただけではなかなか理解できないので、現在も復習中です。実際のところは、scikit-leranなどのライブラリにはGaussian Mixture modelsの関数が用意されているので、複雑な計算をせずに済みます。ただし、パラメータやどのような特性があるかはある程度理解しておく必要があります。

今回のコースはかなり複雑なことをしているせいか、数学的な説明も多いという感じです。しかも画像メインなので、簡単なサンプルコードであっても出力が終わるまでかなり時間がかかります。
これは最初のオートエンコーダーのサンプルで、一層の隠れ層でReLU、シグモイドで出力という簡単なものです。元画像を参照して再現出力するのでほぼ同じ結果。そのため面白くないけれども、簡単なオートエンコーダーをコーディングする練習になるのでいいかもしれません。

次はVariational Autoencoder(VAE) です。エンコードした後に確率分布を使ってデコードするという技術のようです。KLダイバージェンスという二つの確率分布の違いを測る式を用いて、その差を縮めるような計算をしていくようです。仕組み的には段々抽象的になってきているので、もう少し勉強しなおしたほうがよさそうです。ただ、収束させにくい式をこういった収束可能な式に置き換えて何とか計算可能にしている数学的な工夫が面白いです。当然、数学に詳しくないとこのような発想すら思い浮かびません。
理屈で考えるとかなり難しいのですが、どうやって少ない情報から大きな情報へと再現していくのかというのは徐々に分かってきました。しかしながら、この辺のレベルになると一つ一つがかなり難しい。

そして、いよいよ二つのニューラルネットを切磋琢磨させるかのように使うGANsです。今回は最初にMNIST(手書き数字)で試したあと、画像生成のサンプルでよく見かけるCeleb顔画像を使ってGANを試してみました。このCeleb顔のデータセットがでかすぎる。元画像は一枚178x218pxあり、それがなんと202600枚もあります。

こんな感じで解凍すると、このナンバリングが202600まで続きます。合計で1.78GB。

この178x218pxの画像を64x64pxに切り取って、それをサンプルにします。202600枚あるので、もちろんすべてプログラミング上で自動処理です。

そして、いざGANのサンプルコードをランさせると、50イテレーションごとに一枚生成し約15〜18秒かかります。出力中にYoutubeなど見ていると演算が遅くなったりします。ミニバッチ学習をさせているので、合計で1epoch3165回。これで終わりなのかと思ったら、2epochあるので合計6330回です。計算中も次々画像が出てきます。途中でやめようかと思いましたが、ためしに最後までやってみようと、そのままつけっぱなしで次の日をむかえてもまだまだやっていました。
結局、ここにあるように104804秒(約29時間)かかりました。せいぜい数時間かと思っていたら、1日以上かかったということです。強力なGPUマシンが欲しくなる気持ちが分かります。10〜20倍くらい早くなるそうです。

50回目:まだ始まったばかりなのではっきりしていません。50回ごとに、このような画像が一枚出力されます。

200回目、少し色が濃くなってきました。メリハリがでてきた感じ。

1100回目、それっぽくなってきました。

3000回目、かなり良くなってきたものと、まだ変なものもいくつかあります。特に気になるのが赤い顔の人たち。おそらく約20万枚あるうち何枚かが赤い画像だったのかもしれません。

4500回目、よくみると変なのもありますが、それぞれ固有の色味がでてきたような感じです。人種も様々。

6300回目(最後:127枚目)、もうそれほど完成度があがると言う感じではなさそうですが、平均的な顔というよりはきちんと個性が見て取れるような気もします。合成しているうちに全部似てくるときもあるようですが、今回の場合はそんなことはなさそうです。しかし、よく見ると変なのもまだあります。特に左端の下から3番目は、右向きと左向きの顔が合成されたためか、中央だけ細く存在しています。

見比べると確かに向上しているような気もしますが、やや絵画っぽい作風にも見えます。この出力結果が面白いかどうかというよりも、GANの特長である二つのニューラルネットが互いに競い合うことで生成されるアルゴリズムの仕組みが面白いです。この手の画像生成の技術は次々と新しいのがでているので日々見逃せないという感じです(The GAN Zoo)。

ということで、目標としていた画像生成であるGANのサンプルを試すことができたのですが、単にサンプルを動かしただけなので、これで終わりというわけではありません。ここから、自力でコーディングできるようになるために、かなり難しい理論なども乗り越えながら勉強していく感じです。それにしても、それぞれいろんなアルゴリズムがあって、かなり面白い世界だと思います。ものの考え方もけっこう変わりそうです。

関連:

2017年10月9日月曜日

Convolutional Neural Networksのコース

Deep Learningのなかでも、特にGANなどの画像生成の技術に興味があるのですが、その一歩手前としてConvolutional Neural Networks(CNN)も勉強してみようかと、いろいろ探していました。CourseraのDeep Learningのコース4であるConvolutional Neural Networksはまだ開講していないため、もうしばらく待たないといけません(以下)。

Courseraと同様に、UdacityのDeep Learningコースもまだwaiting listのようです(かなり人気あるのかも)。
ほかにも、fast.aiでも無料でCNNの授業はあるようです。一見よさそうなのですが、AWS(有料)を使うようで登録やセッティングがめんどくさそうです。


あとは、前から気になっていたUdemyのDeep Learning: GANs and Variational Autoencodersと同じシリーズのDeep Learning: Convolutional Neural Networks in Pythonというコースです。

GANのコースはあまりないので(fast.aiにはある)、この↑のGANのコースをいずれは受講したいと思っているので、割引価格で1200円(書籍を買うよりも安い)だし、試しにどんなものかということも含めてCNNコースを受講してみることにしました。

Udemy: Deep Learning: Convolutional Neural Networks in Python
このコースでは、TheanoTensorflowの二種類異なる方法でコーディングするようです。Theanoは使ったことはないですがそれぞれメリット/デメリットがあるようで、この他のライブラリも含めどれがいいのかはほとんど好みという感じかもしれません。ただし、Theanoは次の1.0(現在0.9.0)をもって開発終了らしいです(原文)。


このコースの特長としては、試験や課題というものはありません。当然期限もありません。専用の質疑応答のフォーラムはあるので、有料の動画コンテンツ(英語)と質問応答の権利を購入するという感じです。授業で使うサンプルコードに関しては、このコースを受講していなくてもgithubからすぐに手に入ります。
授業内のアルゴリズムや数学的な説明は非常に端的で分かりやすいと思います。数分〜10分程度の動画が合計4時間分あります。ただ動画を眺めているだけではだめで、ノートをこまめにとるとか、コピペなど使わないでコードを書き、実際手を動かすことを強く勧めてきます。たしかにプログラミングの場合はそうしたほうが覚えが早くなります。
数学に関しては、他のコースでも言っていましたが、それほど深く理解しようとする必要はなくて、ライブラリの関数をどう使うのかということに慣れたほうがいいようです。このコースは理論の理解というよりも、コーディングに重点をおいているという感じです。しかし、いきなり本題に入るまえに、簡単なサンプルコードを試したり、いくつかの段階を経て、最後にはまとまったコードを書くということになります。このCNNのコースは上級者向けのようで、基本的なPythonプログラミング、機械学習の基礎は学んでおかなければいけません。たしかに、少し敷居が高そうです。このコース以外にも段階やジャンルに応じていくつかコースがあるので、内容に追いつけない場合は他のコースも同時にやったほうがいいのかもしれませんが、それだけお金がかかってしまいます。

最初のほうのCNNの説明は以下ようなステップになっています。

初心者にとっては、どのような手順で理解していけばいいのか分かりにくいので、このような段階的な説明があると理解しやすくなります。
Convolutionに関しては、まずはフィルターという概念で、Hello worldをしゃべる音源にエコーフィルターを加えるアルゴリズムを書いて実験するところから始まります。次に画像にぼかしフィルターを加えたサンプルで実験します。このへんは最初のエクササイズという感じです。このエクササイズを通して、変換された元データからConvolutionということを感覚的につかんでいきます。その後はこのフィルタリングされた画像をニューラルネットワークに入力して、CNNへと発展させていく感じです。
コーディングはTheanoとTensorflowの2種類用意してあり、もし普段からTensorflowを使っているのであれば、Theanoのコードは使わなくもいいと思います。
できるだけコピペしないで一通り書いてみました。コーディングすると、一行ずつ何をしているのかが分かるので、その分理解も深まります。Theanoのほうでもコーディングしてみると、二つの方法で書くので、さらに理解が深まる感じです。
CNNの大体のパターンはわかったのですが、まだ自力でコーディングはできないので、もう少し繰り返す必要がありそうです。もう少し慣れてくれば、コースに頼らなくても自力で他のサイトなど見ながら勉強していけそうです。

あとで気づいたのですが、CNNは上級者向けで、最も興味あるGANのコースは中級者向けなので、こちらのコースのほうを先にやってみてもよさそうです。

2017年10月4日水曜日

スタンフォード大:CNN for Computer Visionのレクチャー動画

CourseraのDeep Learningコース(コース1〜3)も終わってしまったので、次を探しているところです。興味あるのはConvolutional Neural Network(CNN)、そしてGenerative Adversarial Network(GAN)などのコンピュータービジョンや画像生成に関するアルゴリズムです。

いろいろ調べていると、スタンフォード大のCNNのシリーズレクチャーがありました(以下)。
この動画は今年(2017年)のもので、もうすでに第1回から16回まであります(1動画/約1時間:合計約16時間)。
CS231n: Convolutional Neural Networks for Visual Recognition
というスタンフォード大の授業の動画らしいです。
シラバスのページにはコースマテリアル(資料)のリンクもあり、これに従って一通りCNNについては勉強できそうです。今年の授業なので情報も最新だと思うし。
どうやらこの授業は、今年4/4から開始され、週2回のペース、途中に課題提出などもあり、6/12まで続いていたらしいです。週2回なので、かなりハイペースでやっていると思います。それにしても授業計画ならびにその内容がすごい。いまのアメリカの優れた大学はこんな感じなんですね。
このCNNコースを受講する前に、予備知識としてCS229:Machine Learning(Andrew Ng)を受講しておくといいと言ってますが、これはCourseraのMachine Learningコースの元となっている授業だと思います。
スタンフォード大学コンピューターサイエンス講義リストを見ると、CS230: Deep Learning(Andrew Ng)という授業があり、受講者はCourseraのDeep Learningコースを受けるようと書いてあります。どうやら、CS230の授業とCourseraの授業は同じようです。実際のCS230の授業では、トピックに合わせたさらなるレクチャー、ゲストレクチャーなどがあるようです。シラバスによると、CNNの授業は7週目の11/6からのようなので、それまでにはCourseraのConvolutional Neural Networksも開講するのではないでしょうか。ということであと一ヶ月くらい先という感じ。

追記:
このスタンフォード大学のCNNの動画をしばらく見てみましたが、初回だけFei-Fei Li先生の講義があって、その後はドクターの学生がスライドを見せながらCNNについて講義というか説明しています。教科書の内容をそのまま解説しているだけの授業という感じで、あまり頭に入ってきません。やはり、Andrew NG先生の教え方がいかに上手かというのが分かります。

2017年10月3日火曜日

Coursera: Deep Learning/ コース2、コース3終了

引き続きCourseraのDeep Learningコースのコース2と3を受講しました。

・コース2(3週間):Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
・コース3(2週間):Structuring Machine Learning Projects

コース2においてはRegularization、Dropout、Normalization、ハイパーパラメータの調整、Batch Normなど、けっこう細かなテクニックを学びました。ニューラルネットというよりも、メインのモデルをより効率的に計算していくスキルといった感じです。これもまた実践的な場面ではよく用いられているテクニックのようで、すべてを完璧に習得したというわけではないのですが、それぞれがどんなものなのかということがわかったし、ディープラーニングの世界で用いられているボキャブラリーが増えてよかったと思います。
コース2の後半では、いよいよTensorFlowを用いたプログラミング課題が登場してきました。このままTensorFlowでどんどんプログラミングしていくのかと思ったら、そうでもありませんでした。いままではNumpyだけを使いフルスクラッチでプログラミングしていたけれども、TensorFlowのようなライブラリを使えば一行で済みますよという程度の内容でした。そうこうしているうちにコース2も終わり最後のコース3に突入してしまいました。

コース3ではもうプログラミング課題はなくて、1週ずつ最後に15問のクイズがあるだけです。しかしそのクイズが実際の現場でのケーススタディという設定で、ディープラーニングをつかったシステムを構築している際のデータセットの扱い方や様々なエラーの対処法などに関する問題です。
たしかにこのコースは理論的というよりも実践的スキルと知識を身につけて、すぐにでもこの業界に就職できるかのような教え方をしています。
当初は、ディープラーニングを使った様々なアルゴリズムを習得できると想像していましたが、中心となるアルゴリズム(モデル)に対する細かなテクニック(コース2で学んだ内容)のほうがどちらかというと重要という感じです。あるモデルをつくっても、それが機能するようにするにはデータの扱い方や様々な調整/最適化が必要で、この辺はなかなか独学だと身につけにくい部分かと思います。そんな感じでコース3もあっという間に終わってしまいました。

 コース2の修了書。

コース3の修了書。

結局、現在開講されているDeep Learningコースの1~3を1週間の無料期間内に終わらせてしまいました。前回、受講したMachine Learningコースと重なっている部分もあったので、1〜2週間分を1日で終わらせたというペースです。特にコース1の前半とコース3はすぐに終わってしまうので(動画を見てクイズに答えるだけ)、実質コース1の後半とコース2を数日かけて勉強すればいいという感じです。個人的にはコース2が一番勉強になりました。
1週分約2時間の動画を手書きのノートでメモをとりながら見続けるという感じです。動画を見ているだけだと覚えが悪いので、ノートをとったほうがその後動画を見直す回数もかなり減って効率が上がります。ただ問題は、日本語字幕はまだ準備されていない部分がほとんどなので、英語で覚えないといけないというところでしょうか。
前回、約1ヶ月ほどかけて受講したMachine Leaningコース(11週)のほうが内容が濃かったような気もします。Deep Learningコースは1〜3まで合わせても9週しかないし、そもそも初心者向きでもあるため、それほど大変な内容になっているというわけでもないような気がします。Machine Leaningコースは次から次へと面白いアルゴリズムがでてきてその都度わくわくしましたが、Deep Learningコースはより実践的というか、普段データサイエンティストの人たちがどのようなこと(地味な作業も含めて)やっているのかというのがわかりました。
やはりおすすめは、Machine Learningコース(11週:無料)を受講して、従来の機械学習で基礎を学んでから、その延長というか最近の動向にあわせたDeep Learningコースを受講する順番がいいかと思います。Deep Learningコースも初心者向けなので、このコースから受講してもいいとは思いますが、細かい部分まではあまり丁寧に教えてくれないという感じです。

Deep Learningコース4は一番興味あるCNNなのですが、まだ開講していないので、しばらくは他のコースでもまたのぞいてみようかなと思ってします。

2017年10月1日日曜日

Coursera Deep Leaning Specialization: Course 1 終了

CourseraのMachine Learningコースが終わってしまったので、引き続きDeep Learningコースを受講することにしました。このコースは$49/月の有料コースですが、最初の1週間はお試しということで無料です。前回のMachine Learningコースが充実していたので、1週間すぎて有料になっても構わないと思い、とりあえず登録してみました。


Deep Learning Specializationというコースで、大きくは以下のコースで構成されています。

・コース1(4週):Neural Network and Deep Learning
・コース2(3週):Improving Neural Networks: Hyperparameter tuning, Regularization and Optimization
・コース3(2週):Structuring Machine Learning Projects
・コース4(未定):Convolutional Neural Networks
・コース5(未定):Sequence Models

特に興味があるのがコース4のCNNですが、まだコース4と5は開講していません(そろそろ開講するらしいですが)。コース単体での受講もできるようですが、せっかくなので順を追って受講し、コース4までは到達したいと思っています。

UdemyのGANコース:
しかしながら、同時にUdemyの以下のGANのコースも気になっています。こちらも有料(1200円/割引価格)のコースです。
個人的にGANを使った画像生成に興味があるので、このコースを受講してみたいのですが、まだまだDeep Learningの知識やスキルも追いつかないと思うので、CourseraのDeep Learningコースが終わったら、このGANのコースも受講してみようかと考えています。

以前から独学で機械学習を学んでいたけれども、このようなオンラインコースを受講したほうが理解が早いということが、前回のCoursera Machine Learningコースで分かったので、興味あるコースをいろいろ調べています。書籍で勉強してもいいのですが、書籍だとおそらく途中で投げ出してしまいそうなのと、こういった専門領域の書籍は値段的に結構高いので、必要以上に書籍は購入しないようにしました。情報的な内容に関しては、論文なども含めてかなりネットからも入手できるし、わざわざ専門書を買うまでもないかと。それとこのようなコースだと知識だけでなく、プログラミングの課題もあるので、理解というよりも実践的なスキルが身につくような気がします。


Coursera コース1(4週):Neural Network and Deep Learningを開始
ということで、早速Courseraのこのコースを開始してみました。Week1は概要やこのコース自体の説明などで、特にプログラミングするなどの技術的なことはしませんでした。前回受講したMachine Learningコースとも内容が重なる部分もあるので、さらっと聞き流す感じでも大丈夫でした。同じように動画途中でのミニクイズがあり、Week最後にあるクイズは前回のコースでは5問でしたが10問(8問以上正解で合格)に増えていました。このクイズが結構難しくて、というのも英語なのでよく読まないとすぐに間違ってしまいます。前回のコースでも何回もやり直しました。
Week2からようやく実際的な内容に入っていくわけですが、前回のMachine Learningコースで学んだ内容と重なっている部分も多いという感じです。
ただ今回のコースはPython(Jupyter Notebook)、Numpyを使うので、それに合うアルゴリズムになっているのか微妙に違います。個人的には、Numpyよりも前回使っていたOctave言語のほうがシンプルで分かりやすいという印象でしたが、Numpyにも慣れるという意味で前回の復習も兼ねてすすめてみました。前回のコースのおかげか、Week2まではあっさり終わってしまい、残すところWeek3とWeek4だけです。
Week3からより本格的にニューラルネットワークの勉強です。それと同時にNumpyに則した行列計算方法や偏微分の説明が何回も出てきます。Week最後のプログラミング課題はブラウザ上でJupyter Notebookを使うので、以前のコースよりも便利になったという感じです。相変わらず数行を穴埋めしていく課題なので難しくないのですが、PythonやNumpyには慣れていないと記述の仕方がわかならくなるときもあります。そうやってNumpyにも慣れていきつつ、Week4に入ってしまいました。
この週で最後、複数のレイヤーを持つニューラルネットワークの実装です。相変わらずバックプロパゲーションは面倒で、前回のコースでもやったので原理は分かるのですが、複数層に対応できる一般化した式をいざNumpyで実装となるとけっこう大変でした。前回のコースでもフォワードプロパゲーションとバックプロパゲーションを復習しておきたいと思っていたので、今回Numpyで試してみてまたさらに理解が深まったという感じです。
Week4の最後のプログラミング課題は、一旦計算した値をキャッシュに記憶させておいたり、連想配列のようなディクショナリに変数を登録しておいたりというテクニックを多用しているので、このへんが慣れなくてForumを覗いてなんとか実装することができました。Numpyにおける、forループを使わない行列計算の方法、ブロードキャストなども慣れていないので、Deep Learningの内容というよりはNumpyについてももう少し勉強が必要という感じです。


コース1(4週):Neural Network and Deep Learning終了
無料期間(1週間)ということで試しに受講してみましたが、3日くらいで終わってしまいました。前回のMachine Learningコースを受講していれば、Week1と2は聞き流す程度でもいいと思います。実質、Week3とWeek4をやればいいのかもしれません(それぞれ1日ずつ)。
成績は94.4%です。プログラミング課題はすべて100%で提出しましたが、クイズ(10問中8問正解で合格)のやり直しはせず、そのままどんどん先に進んで行った結果です。もう少し理解を確実にするために復習は必要だと思いますが、次のコース2も受講し始めてしまいました。早くCNNやGANまで進みたいため急ぎがちになってしまいますが、そもそも機械学習やDeep Learning自体が面白いのでついつい次へと進んでしまいます。


受講してみての感想:
このコースは初心者向きらしく、その分前回のMachine Learningコースを受講した人にとっては物足りないかもしれません。コース5まである最初のコースなので基礎的内容が多く仕方ないのかもしれませんが、その後に控えているコース2〜5に期待したいところです。
個人的には、前回のMachine Learningコースがあまりにもよかったことから結構期待していたのですが、前回ほどすごいという印象ではありませんでした。教え方も前回のほうが丁寧だったような気がします。しかし、それは機械学習(従来の方法)とDeep Learning(最近の方法)という範疇の違いから、そうなるのかもしれません。初心者向けなので機械学習に通じる基本を一通りおさらいしつつ、すぐにDeep Learningに入っていくという感じなのかもしれません。たしかにどんどん複雑になっていくので、基本にばかり時間をさいていてもダメなのかもしれません。
ただし、実践力を身につけるという方向性は変わってはいないと思うので、すぐにも役立ちそうなスキルをどんどん教えてくれると思います。
日本語環境はまだそれほど整っていないので、英語に抵抗がある人にはきついかもしれません。しかし数式やソースコードが読めれば、英語が多少分からなくてもなんとかなるとは思います。

コースの修了書を受け取るためには本人確認書類をCourseraに送付しなければいけません。日本語で記載されている運転免許証の画像を送ったのですが大丈夫でした。一晩たってから、このコース修了書が送られてきました(実際は名前も記載されています)。無料期間でも修了書を発行してくれるようです。

続き:
Coursera: Deep Learning/ コース2、コース3終了

2017年9月27日水曜日

Coursera:機械学習コース終了

先月の8/26日にCourseraに登録して、11週あるコースでしたが、32日間でMachine Learningコースを終えました。やはり、評判通り非常に勉強になるコースでした。
教え方が上手であるとか、細かく指導してくれるとか受講者の声が書いてありましたが、まさにそうだと思います。途中その他のコースをちょっとのぞいてみたけれども、やはりこのコースがどれだけ優れているかわかりました。しかも無料でここまでの内容を受講できるというのはすごいことだと思います。以前、ネットを頼りに機械学習を独学していましたが、やはりこのようなコースを受講したほうがずっと早いという感じです。優れた書籍も数多くあると思いますが、書籍を使った勉強だとタイムリミットがないため挫折も多くなってしまいます。人にもよりますが、個人的にはこのようなコースのほうが勉強もはかどりました。
このコースはプログラミングもしながら数式を理解できるので、いままでブラックボックスになっていた部分がかなりはっきりしました。オクターブ言語については、行列計算を楽にしてくれるツールという感じで、今回はじめて使いましたが、すぐに慣れて特に問題ありませんでした。
このコースのいいところは、それほど予備知識なくても一通り機械学習について勉強できるというところだと思います。通常、書籍など買い込んで(買い込んで終わりになってしまうパターンもよくある)で予備知識を得てから学ぶという手順になることが多いとおもいますが、そういった余計な書籍も必要とせず進められました。時間的にも金銭的にも一番ショートカットできるコースだと思います。
やはり教え方が上手いというか、分からない人に分からせようとする熱意みたいなものが感じられます。例えばWikiなどで機械学習について調べてみると、数学的に正確に詳しく書かれていたとしても、分からない人に分からせようという配慮ある表現ではないため理解に苦しみます。このコースは解説がとてもわかり易く(初心者が勘違いしそうな部分は何度も説明してくれたり)、クイズやプログラミング課題も適度な難しさがあって、初心者にとってどの部分を鍛えるのが一番効率いいか分かっているような教え方だと思います。


前半はコースの仕組みやオクターブ言語、そして機械学習そのものにも慣れずにそれなりに時間かかりましたが、後半はかなり順調に進み、授業内容もどちらかというと応用的な方向に移行していったので、思ったより時間がかからず一気に最後まで行ってしまいました。最後の2週は、プログラミング課題もないのですぐに終わってしまい、いきなり今後の楽しみが減ったというか、TV番組の最終回のように少しさびしい感じです。

線形回帰、最急降下法、ロジスティック回帰、正則化、ニューラルネットワーク、サポートベクターマシン、K-平均法、次元削除、PCA、異常検知、強調フィルタリングなどいろんな種類を学びました。複雑な数式も理解できるようになったのはよかったです。

やはりWeek5のバックプロパゲーションまでが大変という感じです。その後は、これまでの内容をベースに応用的に発展させたり、デバッグや評価、あるいは実際のプロジェクトを模倣した演習課題と移行していくので、前半に学んだ基本原理をどのような場面でどのように使うかということも学ぶことができて非常にためになります。

今後は、個人的にはCNNやGANに興味があるので、同じCourseraのDeep Learningコース(有料:$49/月)を受講してみようかと考えています。ここでDeep Learningを学んで、その後はできればGANのような画像生成に進んでいけたらと考えています。

続き:
Coursera Deep Leaning Specialization: Course 1 終了

2017年9月21日木曜日

Coursera:機械学習/サポートベクターマシン

Courseraの機械学習コースを始めてからカリキュラム上ではWeek5ですが、面白いのでどんどん先に進んで現在はWeek7のサポートベクターマシンが終わったところです。全部で11Weekあるコースですが、このサポートベクターマシンでどうやら「教師あり学習」は最後のようで、次のWeek8からは「教師なし学習」へ移行します。

コース前半について:
これまでを振り返ると、コース前半は機械学習の基本となる線形回帰/最急降下法のアルゴリズムを学び、ロジスティック回帰、そしてニューラルネットワークと進みました。途中から過学習を防ぐ正則化という方法を学んだのが、非常に勉強になりました。
基本となる最急降下法の式は上↑のようになりますが(最初この式を見たとき、Σが式中にあるので難しそうなイメージでしたが)、以下の式のように上の式の最後の部分にλの式を追加すると(更に複雑になる)、

自動的に過学習を防ぐ効果があるようで、アルゴリズムとしては一層賢くなったということです。
このコース以前に独学で機械学習を勉強していましたが、ネット検索などすると最初の式は基本の式なので見つけられたのですが、さらなる応用として正則化の式を追加するところまでは、なかなか気づきませんでした。というか、初心者にとっては最初の基本の式だけでも充分勉強になっているので、そこで終わりにしてしまいがちです。やはりこのようなことは独学というよりはコースを通して徐々に蓄積していくのがいいと思いました。

しかしながら、登場してくる式はどんどん複雑になっていきます。独学だとこのような複雑な式が出てくると、先へ進むことをためらってしまいますが、コースの中では何回も登場してくるし、きちんと中身を説明してくれるので理解も深まりつつ、このような複雑な式を見ても驚かなくなってきました。

例えばこれ↑、上の式は正則化されたロジスティック回帰の式。一見複雑に見えますが、ロジスティック回帰でどのように計算しているのかわかっていれば(それほど難しい計算ではない)、特に問題ありません。しかし、その下はWeek4〜5のニューラルネットワークに出て来る式です(相当複雑)。ニューラルネットワークかつ出力が複数あるためΣがたくさん重なっています。これなんかは、独学している最中にネット検索して登場してきたら、大抵の人は見ただけで諦めてしまうと思います。確かにバックプロパゲーションの式も複雑だし、プログラミングで実装する際も面倒です。しかし、一旦プログラミングコードに置き換えると、どのような順番でこの複雑な式が計算されていくかが分かるので、より理解が深まります。このWeek5が前半で最も大変なところかもしれません。個人的にはプログラミングコードに置き換えることで理解が深まりましたが、プログラミングが苦手だとかなり苦戦するかもしれません。
以下が、Week5のバックプロパゲーションのプログラミング課題内のコード。
それぞれの変数を用意し、順を追って計算してくので理解が深まります。式と言っても変数には行列が代入されているので、行列のマトリクスが食い違うとエラーがでてしまいます。しかもニューラルネットワークの場合、バイアス項を追加したり、削除して計算しなければいけない箇所があり、そのまま行列を代入して計算すればいいというわけではないところが面倒です。このコードを実装するために数時間試行錯誤しましたが、その分覚えてしまったという感じです。

ちなみにプログラミング課題は、Atomエディタを使ってやっています。Octaveの課題ファイル、課題説明のPDF、そしてターミナルを分割した画面で同時に開けるので便利です。


Week7/サポートベクターマシン:
カリキュラムの予定より2週間ほど先回りして、教師あり学習の最後であるサポートベクターマシンです。
以前にサポートベクターマシンは少し見たことはあり、マージンを持った決定境界のある分類アルゴリズムという程度の理解でした。あまり線形回帰やロジスティック回帰との区別もできなかったので、特に面白そうとは思っていなかったのですが(直線で区切ることしかできないと思っていた)、サポートベクターマシンにカーネル法が加わると強力なアルゴリズムになるらしく、かなり使えるということらしいです。
しかし、前半の数学的な説明を聞いていると複雑な仕組みとなっているようだったので、先に進む前に、いろいろネットを通して調べたりしてみました。
どうやら数学的にきちんと理解しようとすると、ラグランジュの未定乗数法というさらに難しい概念が出てきて、それによってどのような仕組みになっているのかの理解は深まるのかもしれませんが、あまり理論的な部分に首をつっこむと時間ばかりとられるので、理論的な理解よりも、どのようなことができるのかというような使用法のほうに焦点をあわせていくことにしました。


UdacityのIntro to Machine Learningのサポートベクターマシン:
サポートベクターマシンの数学的な説明によって難解なイメージを持ってしまったため、ほかのコースではどのように教えているのだろうと、以前少しだけ受講してみたUdacityのIntro to Machine Learningのサポートベクターマシンの部分を見てみました。このコースを見るのはもうやめようと思っていましたが、今回は案外役に立ちました。
Lesson3がSVM(サポートベクターマシン)です。このコースのほうが初心者向けという感じです。実際コース内では、ミニクイズやPythonによるプログラミング課題も同時にこなしていきます。
プログラミング課題では、Pythonの機械学習ライブラリであるscikit-learnを用います。プログラミングでは予め用意されたコードに少しだけ書き足すという程度なので、それほどコーディングの勉強にはならないのですが、このライブラリでどのようなことができるのかということを試したりするので、なにができるのかということは分かってきます。当然SVM用の関数も用意されているので、わざわざフルスクラッチでコーディングする必要はありません。いくつかパラメータを渡してあげることで、すぐにカーネル法を使うこともできます。
カーネル法を使うと、こんな感じ↑で複数の領域を曲線で区切ることもできます。パラメータによって、アンダーフィッティング/オーバーフィッティングも簡単に調整できます。

Courseraの授業内でも言ってましたが、数学的な理解を深めなくてもライブラリを使いこなすことはできるので、より実践的な方向性を求めているならば、数学的な原理を追求するよりも応用のスキルを身につけたほうがいいと思います。使用例を見れば、どのようなことができるのかというイメージが湧くので、あとはどこを調整すればいいのかということもわかりやすくなってきます。
ということで、このUdacityのIntro to Machine LearningのLesson3/SVMを一通り見て、大体の概要はつかめたのでよかったです。


再度、Courseraのサポートベクターマシン:
大体のイメージはつかめたので、再度Courseraのコースに戻り、カーネル法から勉強再開しました。カーネル法によってサポートベクターマシンが複雑な分類も可能になるので、これまでの分類アルゴリズムとは違って面白く感じてきました。
しかし、この辺になると、フルスクラッチでSVMを実装するというよりも、便利な既存ライブラリを使って何が可能か、このパラメータをいじるとどうなるのかという、どちらかというと実践的な内容に方向性が変わってきたと言う感じです。
最終的なプログラミング課題もスパムメール判定アルゴリズムについてであり、SVMの仕組みについてというよりも、SVMを使ってどのようにメールの文章をアルゴリズムに組み込んでいくのかという内容でした。最初は難解なイメージがあったので、プログラミング課題も大変なのかと思ったら、案外そうでもなくてあっさり終わってしまいました。


まとめ:
おそらく、Week5のバックプロパゲーションまでが原理的な勉強で、その後は実装したアルゴリズムをどうやって評価するのか、あるいはより良いパラメータの探し方や検証の仕方など、実際に使うことができるようにするために必要な知識やスキルというものへ移行して行った感じです。当然より高度なアルゴリズムを開発することも大事ですが、その使い方や評価も同時にできなければ、有効な結果を出すことができないので、実践的側面についても学ぶことができたのはよかったと思います。

次のWeek8からは教師なし学習なので、さらに面白くなりそうです。やはり、教師あり学習は、答え合わせができるので、その分学習もしやすいアルゴリズムというイメージですが、答え合わせができない教師なし学習によるアルゴリズムにおいて、どうやって答えを見つけていくのか不思議な感じがします。
機械学習を学んでからは数学に対するイメージが変わりました。いままでは数学と言えば、便利な公式があって、長さを知りたければ三平方の定理を使ったり三角関数を使ったりと、求めたいものに応じて公式を使い分けていただけでした。このような計算方法はどちらかというと静的であって、最急降下法のようなコンピュータのループ演算によって動的に答えを導きだす方法を知ったときはかなり新鮮でした。さらには、公式に当てはめて計算するというより、世の中に存在するいろんな数式を部品のように自由自在に組み合わせて、面白い挙動を示すアルゴリズムをつくることもできるということもわかりました。どうしても数学は、これを求めるためにはこの公式が必要という感じで手続きそのものも規則的なイメージがありましたが、優れたアルゴリズムをつくる上でも、もっと自由に計算していいというのが分かってきて、数学もかなり創造的なんだと最近感じでいます。

2017年9月17日日曜日

UdacityのDeep Learningコース(無料)

今日(日曜日)は、Coursera(Machine Learning)のWeek4の締切日ですが、Week4とWeek5を一気にやってしまい、もうすでにWeek6に突入です。Week4からはニューラルネットワークで、Week5には難しいとされるバックプロパゲーションも登場してきました。
使用する言語であるOctaveにも徐々に慣れて来たのですが、いざ動画での数学的な説明をプログラミングコードに置き換えようとすると一筋縄ではいきません。というのも、動画は主に数学的な説明が中心であり、プログラミングとしてどう実装するかまでの説明はあまりありません。プログラミングに関しては、課題文にも多少手ほどきがあり、またサイトには課題ごとのResourcesページがあるので、それを読みながら実装していく感じです(この辺の説明文はすべて英語)。
やはり複雑な行列計算になるので、頭の中に行列のマトリクスがイメージできないとエラーばかりでてしまいます。数学的な数式をコード化するのはまたちょっとテクニックが必要という感じです。なので何回も再提出してようやくクリア。しかし、クリアしたからと言っても、完全に理解したかというと多少怪しいところもあります。なので、バックプロパゲーションについては、forループを使うコード、使わないコードの2種類を書いてみて試してみました。
以前は数式を見てもわからなかったし、当然数式の意味がわからなければ、コードを見ても分かるわけがなかったのですが、いまは見れば分かるというくらいには理解が深まりました。

Udacity: Deep Learningコース(無料):
予定より先に進んでいるので、またUdacityの授業のほうも見ていました。前回の「Intro to Machine Learning」と「Machine Learning」の2つのコースに関しては、概念を理解するにはいいかもしれませんが、プログラミングしながら学ぶという感じではないのでもうやめようかなと(そもそも無料なので辞めても構わない)。その代わりにUdacityにある「Deep Learning」コース(無料:3ヶ月)のほうが面白そうなので少し見てみました。
このコースはGoogleによってつくられたコンテンツのようですが、Googleのエンジニアっぽい人が講師です。やや真面目そうな感じで前述の2つのコースとは違います。レベルもAdvancedなので、ある程度機械学習をやってきた人が見る感じなのだと思います。
内容的には、基礎知識の説明が終わると、すぐにMNIST(手書き文字認識)、そしてデュープニューラルネットワーク、コンボリューショナルニューラルネットワーク・・・と進んでいきます。コンボリューショナルニューラルネットワークに興味があるので(そこまで行けるかわからないけれども)、やってみようかなと。ディープラーニングのコースとなるとだいたいが有料で、このコースだけは無料のため試して見る分にはいいかもしれません。

言語はPython、そしてJupyter notebook(iPython notebook)を使用して、GoogleなのでTensorflowライブラリを用いるようです。Tensorflowに慣れるにはいいかもしれません。Jupyter notebookは以前インストールしてあったので、そのまま使えました。一応細かい説明などしてくれますが、やはり上級者向けだけあって、どんどん先に進んでいきます。なんとなくTensorflowに触れておしまいというコースにも見えなくはないのですが。

現在進めているCourseraのMachine Learningコース(全11週)が終われば、できればディープラーニングへ移行していきたいと考えています。以下は有料ですが、今後の理解度によっては受講してもいいかと。
・Coursera 「Deep Learning」($49/月)
・Udacity 「Deep Learning」($399?)ナノディグリーコース


追記:
もう少しこのUdacityのDeep Learningコースを見続けて見ましたが、Deep Learningの概要を短時間で説明しているという感じでした。プログラミングの課題もいくつかあるのですが、その内容についての細かな説明などはなく、勝手に各自でパラメータを変えてみたりしてという感じです。Lesson3の中ほどでバックプロパゲーションも登場するのですが、約2分間でさらっと説明するだけです(以下がダイアグラム)。
どのような手順で演算していくかまでは説明がありません。ライブラリを使えばすぐに済んでしまうのかもしれませんが、その使い方の説明もないので、おそらくこのコースはざっくりとDeep Learningの紹介をしているレクチャーというかんじで、実際にプログラミングできるようになるためのコースではなさそうです。
Lesson4のコンボリューショナルニューラルネットワークまで見てみましたが、大まかな説明なので期待していたほどの収穫はありませんでした。やはり無料コースであるから、この程度なのかもしれません。
これに比べれば、CourseraのMachine Learningコースは、細かく計算方法まで教えてくれるので、プログラミングしたいという人にはいいと思います。もしくは、ディープラーニングを学ぶなら有料のコースのほうがいいのかもしれません。

2017年9月13日水曜日

Udacityの機械学習コース

前回投稿したCourseraのMachine Learningコース(全11週)を引き続き受講中ですが、Week4のニューラルネットワークは予定より早く終わってしまったので、先回りしてWeek5に入りました。

多少余裕ができたので、他にもこのようなコースがないかと検索していると、オンライン学習サイトとして、Couseraと競合しているUdacityというのもありました。以前はこのようなオンラインコースは、登録も含め面倒なイメージがあって試してみようとも思いませんでした(必要な知識やアルゴリズムなどはネット検索でも充分なので)。しかし今回、試しにCourseraを受講してみると、予想以上にためになるので、このようなオンライン学習サイトも悪くないなと思い始めました。

ということで、Udacityの中にも機械学習やディープラーニングのコースはいくつかあるので、試しにちょっとのぞいてみました。

Udacity:Intro to Machine Learning(無料:全10週間):
まずはこの「Intro to Machine Learning」というコースです。Introと書いてあるので初心者向けっぽいですが、いちおうIntermediate(中級者向け)となっています。
言語はPythonを使用、Pythonについての細かなプログラミング指導はないらしく、プログラミングの知識は多少必要なので中級者という位置づけなのかもしれません。それとできれば統計学の知識もあったほうがいいと言っています。そのためUdacity内の別のコースである「Intro to Descripitive Statisics」や「Intro to Inferential Statistic」も受講すれば手助けになると。
内容的にはこれまでの機械学習という感じで、ナイーブベイズ、サポートベクターマシン、決定木、線形回帰、クラスタリング・・・という流れになっています。

こちらもCourseraと同様に、動画を見て途中にクイズが挿入され、プログラミングコード演習もあります。CourseraのMachine Learningコースと比較すると、動画の画質やシステムそのものはかなり完成度があると言う感じです。
UdacityはGoogleやAmazonなどにも支援されているようで、さすがに潤沢な資金があるのかいろいろ工夫されている印象です。要点だけを説明していく真面目な大学の講義とは違って、ややカジュアルな感じで(たまにジョークなど入れながら)、TVの教育番組を見ているという感じです。楽しみながら(飽きさせずに)学んでいくという工夫がなされているのかもしれません(あるいはエデュテイメント:エデュケーション+エンターテイメントという感じなのかもしれません)。
動画は字幕があるものないもの、ばらつきがあります。日本語の環境はそれほど整っているとは言えません。英語の字幕はあるので、聞き取りにくい場合は英語字幕を手がかりに理解していくと言う感じでしょうか。

このコースは無料なので動画はYoutubeでも見れるようです。一つずつの動画は短いもので1分以内、長くても5分程度です。かなりテンポよく進んでいきます。このテンポの良さで、次の動画また次の動画とついつい見てしまい、気づくと1時間くらい経ってしまいます。延々と長たらしい説明を聞くよりはいいのかもしれません。このテンポの良さも工夫されている点かもしれません。

動画による説明の合間や終わりに、以下のようなクイズ画面が出てきます(画面が突然切り替わる)。

選択方式のクイズもあれば、数値を空欄に入れるタイプもあります。「SUBMIT ANSWER」を押すと正解/不正解が確認できます。不正解になっても特にペナルティなどはないようです。

さらにPythonによるプログラミング演習の画面にも自動で切り替わります。
ブラウザ上でPythonのプログラミングができて、「TEST RUN」を押せば内容を実行できます。Pythonは事前にパソコンにインストールしておく必要がありますが、このコースのために特に設定などせずにすぐに動きました。勉強している内容というよりも、このブラウザ内でPythonコードを実行できる仕組みに感心しました。
CourseraのMachine Learningコースの場合(Octave言語使用)、一旦サイトのリンクからプログラミング課題に必要なファイル群をダウンロードし、各自のエディタやターミナルを使ってプログラミングするという仕組みでした。課題提出はターミナル上からできるので、それほど手間はかからないのですが、ブラウザだけですべて可能なUdacityのこの仕組はかなり便利だと思います。

全体の10%くらいを一気に見てみましたが、Introというだけあって機械学習の予備知識なしで始められるという感じです。多少機械学習をやったことがある人にとっては、余計なジョークや冗長な説明が必要ないとも感じられますが、たまに抜け落ちている知識もあるので、とりあえず勉強してみる分にはいいと思います。UdacityもCourseraもスマホに対応しているので、アプリをインストールすれば、電車などのなかでも受講可能(受講というか普通に動画を見る感じ)です。


Udacity:その他のMachine Learningコース:
先程のコースとは別に機械学習なら以下のようなコースもありました。
強化学習や教師なし学習などのコースも別に用意されているので、もう少し内容を絞って勉強したい場合はこちらのコースがいいのかもしれません。

とりあえず、真ん中のMachine Learningコース(無料:4ヶ月間)をちょっと覗いてみました。
このコースは二人の男性が講師となって機械学習の基礎から教えてくれます。一人の講師が講義してくれるモノローグタイプとは違って、二人の講師がお互いに質問したり、つっこみを入れながらテンポよく説明していきます。やはり、講義というよりは教育番組と言ったノリでしょうか。ただ、その分やや早口の口語表現が多いので英語が聞き取りにくいかもしれません。ただし、しばらく聞いていれば、この人たちの声質に慣れてくるので次第に聞きやすくなってくるとは思います。内容的には、機械学習の初心者に合わせて細かい説明やクイズがあるのでわかりやすいとは思います。


その他の有料コース:
Udacityにもたくさんコースがあり、機械学習のほか、AI、ディープラーニングなどの興味を引くものとして以下。
AIだとこんな感じのコースがあり、レベルもAdvanced(上級者向け)で有料(1ターム/12週間/$800)。無料コースとは違ってナノディグリーという修了証が取得できるようです。おそらくシリコンバレーなどで働くIT関係の人たちが、ここでナノディグリーを取って即戦力となって先端技術領域で活躍できるようなプログラムになっているのかと。会社に入ってからいちいち新米に教育している暇もないので、このようなコースで事前に必要な知識とスキルを身につけておけということでしょうか。コースの説明を見てみても、このスキルを身につければ、最低でもいくらの報酬がもらえる仕事につけるということまで書いてあります。


そしてディープラーニングのコースだと、以下のような感じ。

特にDeep Learningのナノディグリーコース(有料:たぶん$399)は気になります。このコースはそれぞれCNN、RNN、GANなどに分かれた構成になっているので、特に興味のあるGANのコースは受講してみたいと思いますが、もうすでに受講締め切りしており、現在次回受講の予約を受け付けているようです。

講師の一人であるShiraj氏(上画像左)のYoutube動画はたまに見ていたので(このコースの動画だとは知らなかった)、どんな感じか予想できますが、Courseraのdeeplearning.ai(Andrew Ng)という選択肢もあり、お互いに競い合っているような感じに見えます。Udacityとしては、このDeep Learningコースは特に力を入れているのかもしれません。GoogleやAmazonの支援だけではなく、こういったYoutubeで人気のある人たちも巻き込んでより一層オンライン教育プログラムを充実させているようです。しかもかなりの経済効果もありそうです。もはや、教育コンテンツだけでなくエンターテイメントコンテンツ(エデュテイメント)という感じです。


感想:
いろいろ目移りしても仕方ないので、Courseraのコースが終わったら、つぎにどうするか考えてみようと思います。ノリとしては、やや真面目路線のCourseraのほうが好みですが、Udacityのような試みも気になるところではあります。コースの受講内容というよりは、何かを学ぶというスタイルが徐々に変化/進化していて、従来のような書籍(教科書)を購入して学ぶという方法、学校に通って学ぶという方法は、もはや必要ないのかもしれません。
日本国内にもこのようなオンライン学習サイトはありますが(以前Node.jsをドットインストールの動画を見て学習したことがある)、まだまだボトムアップ的な内容が多いようで、ディープラーニングなどのようなコンテンツはあまり見かけたことはありません。やはりこういうコンテンツはアメリカのほうが進んでいるのでしょう。

CourseraやUdacityは魅力的なコースが多いのですが、やはり日本人にとって問題となるのは英語でしょうか。特にプログラミング関係は元々英語表記なので、この際日本語を忘れて(英語の勉強もかねて)、普段から英語を使ったほうがよさそうです(いちいち頭のなかで日本語訳しないようにする)。英語における文学的なニュアンスは難しいと思いますが、このような理系の説明であれば、専門用語以外はそれほど難しい表現もなく端的で明快な英語なのでわかりやすいほうだと思います。特にプログラミングの場合は、コードや数式があるので、それらを見ていけば大体理解できると思います。

人気の投稿