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

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



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


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月29日金曜日

Raspberry Pi Zero Wのリチウムポリマーバッテリー化(その2)

Courseraの機械学習コースも終わったので、中断していたRaspberry Pi Zero Wのリチウムポリマーバッテリー搭載の作業の再開です(前回までの様子はこちら)。

Raspberry Pi Zero Wは小型で便利なのですが、スタンドアロンのWifiカメラとして使用する際に、既存のモバイルバッテリーだとちょうどいいものがないので、できるだけZero Wのサイズにフィットした電源供給方法を既存の部品などの流用でつくれないかという試みです。まだ試作段階なので、仕上がりなどは中途半端です。

部品類:
・アクリル板:67x30mm、2mm厚(Zero Wのサイズは65x30mm)
・電源用スイッチ(ON/OFF)
・リチウム充放電回路(出力:5V、入力:5V/MicroUSB)
・リチウムポリマーバッテリー:48x30mm、8mm厚、3.7V/1200mAh
・その他、M2.6、M2ネジ、赤黒ワイヤ、ポゴピン


電源供給端子:
まずは、Zero Wのどの端子に電源供給するか?という部分からスタート。以前も書きましたが、

上画像のPP1とPP6(Zero基板には端子番号がプリントされているようですが、Zero Wだとプリントされていない)に5Vを接続することにしました。この端子、PP1(5V)、PP6(GND)は、電源供給用のMicroUSBと直結しているようなので、ここに5Vを接続。直接ハンダづけしてもいいのですが、前回書いたようにポゴピンを接点にしました。
スイッチの中央の端子にポゴピンをハンダづけしています。スイッチは秋月で購入した表面実装用の小型なもので、足の部分を折り曲げてまっすぐにしています。これはZero WにおけるGND側の端子となります。そして、これをアクリル板をベースにして以下のようにとりつけます。
アクリル板にポゴピンと同じ径の穴を開け(段差もついているので2段穴)、差し込みます。そのままだと抜けるので瞬間接着剤で固定。手前のポゴピン(GND:Zero WのPP6端子へ)がスイッチと直結、奥のポゴピン(5V:Zero WのPP1端子へ)は赤ワイヤとハンダづけしてあり充放電回路につながっています。
ポゴピンの直径は1.5mm(アクリル板の貫通穴)、見えている電気接点となる先端が丸い部分は直径1mm、全体の高さが3mmと非常に小さいので作業も大変です。
AliExpress.com Product - 10pcs Ultra small spring loaded pogo pin Diameter 2.3mm 3.0mm heigth brass material with Gold plated 1u 10個セットで344円(送料無料)


リチウム充放電回路:
一番悩んだのが、リチウム充放電回路です。今回は5V電源を供給するため、充放電回路に昇圧回路も内蔵しているものを探しました。Zero Wは3.3Vで動作するためGPIOピンに3.3Vを接続すれば動くようですが、5V電源も取れるようにということで5Vにしました。回路で昇圧して降圧するのでその分ロスが大きくなりますが、今回は5V入力の方向で。

条件としては、
・USB5Vで充電可能(できればMicroUSB端子つき)
・5V出力(昇圧回路つき)
・充電と放電が同時にできるもの
・できるだけ小型

以下は、前回試してみた充放電回路です。
左から、
・AliExpressで売っている昇圧充電回路(300円前後)
・アマゾンでも購入可能なTP4056搭載の回路(安い:100円前後)
・Wemos Battery Shield(AliExpressで200円前後)
・18650モバイルバッテリー内の回路流用(安い:AiExpressで100円程度)
上記各回路については前回参照。


上記以外にもいくつか試しに購入してみた結果、以下の回路が上の条件を満たしていたので採用。
AliExpress.com Product - 5V Lithium Battery Charger Step Up Protection Board Boost Power Module Micro USB Li-Po Li-ion 18650 For Power Bank DIY New XQ148円(送料込み)、サイズ:22x18x11mm
おそらくこれは18650モバイルバッテリーなどに内蔵されている回路だと思います。上画像上部に見えるのがMicroUSBソケット(メス)、ここからUSB経由で充電(5V入力)。基板真ん中付近のOUT-とOUT+端子が5V出力。ここをZero Wの電源端子へスイッチを介して接続。通常のUSBソケット(メス)を搭載できるような基板になっていますが、送られてきたものは、この画像にある通りUSBソケット(メス)はついていません。どうせ使わないので、このままのほうがいい。さらに基板下の左端とやや中央に見える穴がリチウムバッテリーと接続する端子。

配線図:ポゴピンはZERO Wの両端子の位置に取り付けます。
ただし、以前購入した18650モバイルバッテリー(100円程度)は、充電と放電が切り替え式になっており、充電しながらの電源供給ができないというタイプもたまにあるので注意。あるいは、充電中(5V入力)は5V出力するけれども、USB充電接続を外すとバッテリーからの出力に切り替わるため、昇圧回路が内蔵されていないものだと3.7V出力になってしまうものなどもあります。自分で充放電回路をつくったほうがいいかもしれないと思いましたが、面倒なのでいろいろ探しているうちに今回の回路(しかも安い)が見つかったというわけです。

この充放電回路は比較的小型なのですが、厚みが意外にあります。横からみると分かるのですが、基板の両面に部品が載っています。特にMicroUSBソケット(メス)が上面左にあり、コイルが下面右にあるため、全体的に厚くなってしまいます。そのため、以下のようにアクリル板にコイルの部分が埋没するように穴(直径6mm)をあけてなんとか厚さをを吸収しました。
それでも、コイル以外の部品ものっているので、スペーサーをいれて少し浮かせています。幸い固定用の穴も回路上についているので、アクリル板にネジ穴を切ってM2ネジで固定しました。ネジ固定されたので、充電の際のMicroUSBの抜き差しにも耐えられるでしょう。ちなみに、アクリル板とZero WはM2.6ネジで四隅を固定します。ナットは使用せず、タップでアクリル板にネジ穴を開けています。

バッテリー:回路の大きさによってバッテリーの大きさも左右されてしまうのですが、最低でも1000mAhのバッテリーという条件にして探してみました。30mm幅で厚みが8mmになるといくつかあり、今回は長さ48mmで1200mAhを使うことにしました。8mmも厚みがありますが、充放電回路もそこそこ厚みがあるので大丈夫でしょう。逆に薄さを優先するとバッテリー容量も減ってしまうので、このくらいがちょうどよさそうです。
AliExpress.com Product - Liter energy battery 3.7V lithium polymer battery 803048 1200MAH GPS navigator PSP game sound card1111円(送料込み)、保護回路つき。AliExpressでもリチウムポリマー電池はそれほど安くもないのですが、日本よりは安いかと。しかし、送られてきたのはTurkey Postからでした。最近バッテリーなどはトルコで生産しているのでしょうか?

全体的にはこのような厚み。バッテリー上面からZero WのHDMI端子までの厚さで15mmあります。バッテリーは両面テープで仮止めしています。さらに、これを全体的に覆うようなケースもあるといいかもしれません。いまのところGPIOピンは取り付けていないのですが(主にWifiカメラだけの使用を前提)、取り付けると更に厚みが増すので、もし使う場合はその部分もポゴピンにしてしまおうかと思っています。

ちなみにカメラをつなぐとこんな感じ。カメラを起動してもエラーがでるので、なんでだろうと思ったら、実はカメラの向きが逆でした。以下がこのカメラ(V1)に対しての正しい向き。ちなみにもう一つ持っている暗視カメラのほうは、この↑向きと同じ。カメラによって向きが異なる点も注意が必要です。
AliExpress.com Product - Free Shipping raspberry pi camera 5mp pixels RASPBERRY PI CAMERA739円(送料無料)、これは5メガピクセルのV1カメラです。フラットケーブルコネクタが基板背面についています。ちなみに最新のV2カメラは8メガピクセルにスペックアップしています。スペックの違いはここを参照
AliExpress.com Product - Raspberry Pi 2 Camera module 5MP OV5647 Night Vision Camera + 2pcs Sensitive infrared light compatible For Raspberry pi 3 camera2254円(送料無料)、こちらが暗視カメラです。5メガピクセル。カメラ両サイドに脱着可能な赤外線LED照明がついてます。このカメラの場合はフラットケーブルコネクタが基板上面についているので、先程のV1カメラとは向きが逆になります。

カメラは固定していないので、やや宙に浮いています。おそらく、上下にもう一枚ずつアクリル板などを重ねて、カメラの固定とバッテリー保護を兼ねてケース化するとよさそうです。右側に緑のLEDが光っているのが確認できると思いますが、とりあえずこの状態で動作確認できました。VNC経由でパソコンからもカメラ起動できましたが、何時間持つのかはまだ計測していないのでわかりません。確かWifiにつないでいる状態でも200mAくらいだったので数時間は持つかと。ただし、長期的な安定性などはまだきちんと検証していないので、その辺の問題はこれからでてくるかもしれません(今回使用した充放電回路もどの程度信用できるかわからないので)。


今回単にスイッチがついただけでも便利になりました。あとは、カメラとの一体化も含めた全体的なケースの制作です。
追記: その後、Aliexpressで以下のようなバッテリー(2086円、送料込み)を見つけました。 AliExpress.com Product - Raspberry Pi Zero 0 W UPS power Expansion board, integrated serial port, power detection



関連:Raspberry Pi Zero Wを購入Raspberry Pi Zero W:IPカメラ実験(Picamera)

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

人気の投稿