Neural Networks and Deep Learningの講座に挑戦するも尾羽打ち枯らした話

ようやくこのブログでも、AIについて触れることが出来ました。自分がプログラミングの学習をスタートしようとしたのは、昨今のAIブームによるものが大きく、当初の自分の計画ではゼロベースからAIエンジニアを目指すという無謀極まりないものでしたが、紆余曲折を経て、現在はあくまでAIトレンドに関してはアンテナを張るだけに留まっています。

 

さて、本記事では、Deep Learning Specializationのプロジェクトの最初の講座であるNeural Networks and Deep Learningについて、振り返りをしたいと思います。

 

www.coursera.org

 

前置きとして、自分はブログタイトルにもあるように、この領域に関しては一切のアカデミックバックグラウンドを持ち合わせておらず、全くの素人であり、あくまで本記事は、素人目線による経験談にしか過ぎないことをご了承下さい。加えて、講座の具体的な内容については、既にQiitaの方でまとめられている方がいるので、興味のある方はこちらを参考にすることを推奨します。

 

qiita.com

 

この講座の魅力としては、講座の提供元が本場のdeeplearning.aiであることと、現代の人工知能界隈の最大の牽引者であるとも言えるAndrew Ngが講師を務められていることにあります。Andrew Ngについては、Courseraで非常に高い評価を得ている以下の機械学習の講座が有名で、こちらの講座をきっかけとして名前を知った人も多いのではないでしょうか。

 

ja.coursera.org

 

自分は深層学習を学ぶにあたって必要となる機械学習の知識に関しては、以下のUdacityの講座を履修することでカバーしたのですが、既に内容がうろ覚えになってしまっていることから、いずれ本領域への学習再開の目処が立った際には、まずは改めて上記講座からスタートを切りたいと考えています。

 

www.udacity.com

 

講座では2層NNとL層NNの構築を行い、猫の画像識別モデルを作成することが最終的な目標となっています。上記NNの実装に必要な各数理モデルの理論の説明→numpyを用いた実装、という流れを何度も繰り返しながら、ジュピターノートブック上で段階的な構築を少しずつ行っていく感じです。自分は数2Bの知識も怪しいレベルでしたので、微積やベクトル・行列を復習する必要がありましたが、そうした受講者に対しての補足回も含まれているという超絶親切っぷり設計です。しどろもどろになりながらも、一応の実装を終えることができ、猫の画像識別は成功しましたが、間違いなくこれまで受講した講座の中で、一番ハードな内容でした。

 

講座のねらいとしては、初めにニューラルネットワークディープラーニングの理論を受講者にしっかりと理解させることで、後々の講座で扱うことになる、TensorFlowに代表されるような主流AIフレームワーク群を極力ブラックボックスとして運用させないようにすることにあります。

 

また、それぞれのセクション末にはコラムとして、業界の著名人に対してNg先生がインタビューを行うパートがあります。そこでは「これから人工知能を学びたいと思っている人はどのようなキャリアを歩めばよいか」といった、我々が最も気になるであろう点についてクリティカルに触れられており、これを視聴するだけでも、何となくAIに興味を持たれている方にとっては、一見の価値があるのではないかと思います。

CourseraのUsing Python to Access Web Dataの講座でWebスクレイピングを学ぶ

前回では「ひとつのプログラミング言語」「データベース言語」について学ぶ事が出来るオンラインコース、「Python for Everybody Specialization」を取り上げました。

 

www.coursera.org

 

本記事では、さらにそのプロジェクトの中の一つの講座「Using Python to Access Web Data」について取り上げたいと思います。 お伝えした通り、自分はこの講座を受講したことでプログラミングの実用性を正しく理解することが出来ました。講座では、BeautifulSoup4というライブラリを用いて、Webスクレイピングを行います。このライブラリによって、HTMLを取得、解析することで、Web上の任意のソースを取得することができます。加えて、正規表現を活用することで、取得対象をより特定させることも学びます。

 

www.coursera.org

 

幸運だったのが、丁度この時期に実生活において初めて野良のエンジニアと交友を持つことができ、彼がこの講座のサポーターとしての役目を果たしてくれた事です。とりわけ、正規表現の利便性を説いていたのが印象的でした。

 

さて、現在は上記の2つの手法に加えて、Seleniumというツールをブラウザのオートメーションのために扱うようになりました(Webアプリケーションのテストツールなので、本来的な使い方ではないかもしれません)。Seleniumは上記講座では触れらていませんが、BeautifulSoup4、正規表現と組み合わせる事で、PythonによるWeb上での処理はかなり自由度が高まったのではないかと思います。

 

qiita.com

 

これまで取り組んでいた課題では、Webのインタプリタ上やCLI上で指定された結果を出す、といったものが殆どだったので、実際のプログラムの処理動作を(初心者にもわかりやすいように)視覚認識する機会にはあまり恵まれていませんでした。その点、Seleniumにおいては、ブラウザがその役目を疑似的に果たしてくれるので、「自分の書いたプログラムが視覚的に動いてくれている」ということを実感できる。 この体験は、自身のモチベーションを跳ね上げることに一役買ってくれました。

 

自身の最初のSeleniumの用途としては、明らかに手動でやる分には非効率的だろう、と考えられるタスクの自動化でした。これからもルーティンタスクについて存分に活用していきたいなと思っています。現在、思いつく限りでも日常生活においてWeb上の2、3つほどの単調なタスクを抱えているので、自身のスキルの拡張性が高まる機会だと思って貪欲に取り組んでいきたいと考えています。

Pythonを0から学びたいなら、ミシガン大学のPython for Everybodyという講座がおすすめ

前回書いた記事で取り上げたエンジニアに求められるスキルセットから、「ひとつのプログラミング言語」と「データベースの基本知識」について自身のこれまでの経験と照らし合わせていきたいと思います。

 

現在、自分が最も使用頻度が高い言語はPythonであり、Pythonからスタートした理由としては、そもそもプログラミングをスタートしたのがAIのブームに乗っかかろうとしたミーハーな気持ちからであり、加えて最初に受講したCS101でPythonが用いられていたためです。

 

www.udacity.com

 

その後、OO設計の理解やコーディングのクイズ集を解くために、Javaへと学習派生しましたが、最初のHello, World!出力だけでも、クラスや変数の型の宣言、コンパイルですら手間を感じずにはいられなかったということから、改めてPythonのシンプル且つ明瞭な設計思想の恩恵を実感しており、初学者に最も適した言語であると思います。

 

さて、自分がPythonについて、ようやくある程度の理解をする事が出来たなと自信を持つことが出来たのは、以下のCourseraの講座を修了した後になります。

 

www.coursera.org

 

最初に取り上げた、CS101はあくまでPythonを手段として用いることによって、計算機科学分野への案内をすることを目的としており、言語習得そのものにフォーカスをされた講座ではありません。(計算機科学を始点として学び始めるのはとても良いことだと思います)TechnicalDevGuideでも、CS101の後に薦められているのが、「少なくとも1つのオブジェクト指向プログラミング言語について学ぶ」であり、自分の場合はクラスセントラルでも評判の良かった上記のCourseraの講座を選択することにしました。*1

 

このスペシャライゼーションのプロジェクトは5つの講座を1つに統合したものであり、それぞれの講座の主題を簡単に説明すると以下のようになります。

 

1.Pythonの基礎について学ぶ

2.Pythonのデータ構造について

3.PythonでWebデータへアクセスする

4.データベース(!)について

5.以上の知識を用いて、Web上でデータを視覚化するアプリケーションを作る

 

このプロジェクトの良かった点としては、あくまで言語にフォーカスされているのは1,2番目の講座のみであり、その後は「Pythonが使って何が出来るのか?」というプログラミング初学者が最も気になるであろう点を、実戦形式でレクチャーしてくれることにあります。Python以外にもjavascript,json,SQLといった言語がカバーされておりPythonとこれら他言語や外部モジュールを組み合わせることによって、プログラミングが実用的なメリットを持ち合わせていることを正確に実感することが出来ました。この中でも、当時はjsonに対しては気味の悪い言語だなと思っていましたが、今では一番「知っててよかった」と思える言語の代表です。

 

次回は、3番目の講座で取り扱われているWebスクレイピングの技術について書く予定です。

*1:ちなみに、担当する講師はミシガン大学の教授でとてもユニークな方です。

エンジニアのためのキャリア形成指南書である、CAREER SKILLSを購入しました

CAREER SKILLSという書籍を買いました。 

CAREER SKILLS ソフトウェア開発者の完全キャリアガイド

CAREER SKILLS ソフトウェア開発者の完全キャリアガイド

 

 

まだ、エンジニアとしてキャリアを進めていくかは考え倦ねている状態なのですが、先日そのための取っ掛かりとなる機会を運良く得る事が出来たことから、エンジニアという特異なキャリアの中で、(日本と海外の市場は事情が異なる事を理解しつつも)本著をコンパスのように活用させていきたいと考えています。

 

もっとも最大の動機としては、前著であるSOFT SKILLSをよく図書館で何度も読み返しており、著者に非常に影響を受けたことが大きいです。この新書の存在については前から知っていたことから、翻訳が出ないものかと待ち望んでいたのですが、ふとしたきっかけで訳書が書店で並べられていたことを知り、久しぶりに衝動買いをしてしまったという経緯があります。

 

これからは、随時各章の内容について自身の現状と照らし合わせながら、考察をしていきたいと考えています。例えば、第3章「身につけないといけない技術スキル」では、エンジニアに求められる最低限のスキルセットが記述されています。

 

・金になるスキル

・ひとつのプログラミング言語

・コードの組み立て方

オブジェクト指向設計

アルゴリズムとデータ構造

・開発プラットフォームと関連テクノロジー

フレームワーク、またはスタック

・データベースの基本的な知識

・ソースコントロールシステム

・ビルドとデプロイ

・テスト

デバッグ

メソドロジー

 

これらについては、GoogleのTechnical Dev Guideで記載されていたエンジニアになるための必須スキル群とやはり共通するものが多く、本著で記載されていなかったのは「暗号化」「機械学習」「離散数学」などの知識でしょうか。これまでの経験で何とかカバー出来ているだろうと思えるのが、以下の3つぐらいしか思い当たらないため、ひどい焦燥感に駆られてしまいますが、愚直に一つずつ進めていくのが最善であると思います。

 

・ひとつのプログラミング言語

・開発プラットフォームと関連テクノロジー

・データベースの基本知識

 

加えて、現在絶賛格闘中であるのは以下の3つです。

 

オブジェクト指向設計

アルゴリズムとデータ構造

・コードの組み立て方

 

次回は、上記必要スキル群に対応するような学習計画、あるいは経験に基づくレビューを行う予定です。

 

CodingBatに取り組んでいます

某日、更新されたGoogle Tech Guideを眺めていると、基礎コースがあったので、基礎力を確かめるためにも、取り組んでみることにしました。
ガイドの流れとしては、まず初めにGoogleで以前出題されたinterview問題を任意のプログラミング言語で解くことになります。
自分はこの問題については、全くのお手上げ状態で、せいぜい問題の意図を理解するのがやっとで、やはり自分の実践的なコーディング技術の無さを痛感しました。
その後に、Javaの文字列及び配列についてのショートビデオを見ることになります。
そして、Coding問題へと取り組んでいくのですが、たった2本のショートビデオを見ただけでは当然出来るはずもなく。。。
出題されたのは、簡単なWarmingUp問題だったのですが、Warmupどころか自分の頭がオーバーヒートしてしまうことになってしまいました。
 
CodingBatには、それぞれの問題のページ下部にDifficultyという難易度が設定されています。
100から400のレンジで、先程のガイドで出題されているのは大体300~のレベルです。
100代の問題を眺めていると、何とか頑張れば解けなくもない、というレベルであることが分かったので、自分は一度このサイトを0から取り組んでみることにしました。(アカウントも作成した)
Javaの基本的な、if文、for文ですら、正しい記法を理解していなかったので、問題を解いていく中で、リファレンスを参考にしながら、ようやくそれなりには扱えるようになってきました。一日少しずつやっていたので、三分の一以上は終わった、というぐらいでしょうか。
 f:id:p0ny:20180528214230p:plain
 

再帰、Map、ラムダ式といったものがまだ残っていますね。

 
なお、今回CodingBatに取り組むにあたって、いつもお世話になっている知人のエンジニア君にも一緒に問題を解いてもらうことが度々ありました。(感謝)
解答したコードを見せ合って、お互い自らの解法・手法について意見を述べ合うという流れでしたが、これが意外と勉強になることが多く、これはエンジニアとしてやっていくにしても、必要不可欠なフェーズであるということを強く認識しました。
当然ですが、自分の方がまどろっこしい書き方をしていることが多々あり、如何にして可読性が高いコードを書くか、という問題に対する意識が少しずつ芽生え始めて来た気がします。
 
GoogleTechGuideの基礎編で出題されているCodingBatからの問題は、何とか取り組めるレベルにはなってきたので、今週はこちらのGuideをより進めていこうと思います。
ではでは。

ポモドーロテクニックが面白い

プログラミング学習において、ポモドーロテクニックという生産性管理の手法を試験的にですが実行することにしました。

この手法は、SOFT SKILLS ソフトウェア開発者の人生マニュアルという書籍を通じて知りました。

こちらの本は、一言でいうとエンジニアによるエンジニアのための自己啓発本です。

図書館に展示されていたのを数回読んだだけなので、改めて購入後にレビューをしたいと思っています。

 

ポモドーロテクニックというのは、25分の作業時間と5分の休憩時間のセットを1ポモドーロとして、生産性を表す単位とする手法です。

そういえば、3月に受講していたDMM英会話も1レッスン単位が25分なので、もしかすると、これに基づくものなのかもしれません。

 

自分はこれまでのアプリ体験で、明らかに生産性が向上したものを挙げるならば、ライフログ管理アプリのEvernoteとTodo管理アプリのTodoistの2つを推したいのですが、もう一つ気になっていたのがTogglという時間管理アプリでした。

幸いこのTogglに上記のポモドーロテクニックを実行するための機能が備わっていたため、Togglの有用性も少しずつですが理解することが出来てきました。

 

この手法を採用しているユーザーの記事を幾つか読みましたが、どうやら一日に平均8ポモドーロ(約4時間)ぐらいが限界のようです。

しかしながら、ポモドーロテクニックが真に有用なのは、1日毎に振り分けられる、自身の持つ時間という1資産の保有量を自覚させてくれることにあるのではないかなと思いました。

例えば、一日に自分は8ポモドーロという生産性の通貨を持っている、ということが分かれば、当然ペイする対象には慎重になってきますし、人生において本当に自分が取り組みたいということに対しての時間投資感覚が研ぎ澄まされていくのではないでしょうか。

ポモドーロという名前も中々ユニークで、どこか某国の通貨名のような響きを持っており、とても記憶に残りやすいです。

Pythonから新たにJavaを学び始めました

これまではPythonしか知らなかったのですが、新たにJavaを学び始めることにしました。

自分が知る限りではJavaやCは初心者が最初に学ぶのは推奨されていなかったので、これまでは当面はPython一本で良いかと考えていたのですが、改訂された方のGoogle Tech Dev GuideのFoundationsを少し触ってみたところ、Javaでのコーディングが指定されていたのがきっかけです。

 

こちらのガイドの前半部は、http://codingbat.com/javaから問題が出題されるのですが、そもそもにJavaのコーディング形式を知らないので、当然ながら手詰まりという悲しい結果で終わりました。

そこで、リファレンスを参照にしながら1からこのCodingBatのサイトの問題を解いていくことで、今週はJavaに少しずつ慣れていこうかなと思っています。