読者です 読者をやめる 読者になる 読者になる

サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

UdacityのDeep Learning Nanodegree Foundationを修了しました

UdacityのDeep Learning Nanodegree Foundationを修了しました。受講期間は約4ヶ月でした。

Deep Learning Nanodegree Foundation | Udacity

f:id:kakakazuma:20170517222932p:plain

主な学習内容

  • numpyでの多層パーセプロトン実装(これ以降は全てTensorFlow)
  • 畳み込みニューラルネットによる画像分類
  • RNNによるTV番組の会話文字列生成
  • LSTMによる英語-フランス語翻訳
  • DCGANによるMNIST, CelebAの画像生成

課題の内容は GitHub - udacity/deep-learningで確認できます。

受講した感想

4ヶ月という短期間でDeep Learningの分野を幅広く学べたので、初学者の入りとしては中々良かったかなと思います。

レビュアーがついてくれるので、行き詰まるということがあまり無かったのが好印象です。例えば「この場合weightの初期化を一様分布では無く正規分布で取った方が良い」とか、「Labelをスムージングした方が良い」とか初学者が気づきにくいようなところを指摘してくれるのは有り難かったです。学習の助けになりそうな記事もたくさん紹介してくれました。(全て英語記事ですが)

紹介してくれた英語記事などは個人的な備忘録としてこちらにまとめていますので、もし興味あれば。

数式少なめの機械学習系記事まとめ

ただ4ヶ月で幅広くやるという都合上、1つの分野の掘り下げが浅くなりがちだったので、興味を持った分野に関してはもう少し自分で学習しようと思います。

注意点

僕が登録した時は受講費用は$499でしたが、まあ安くは無い金額だと思います。なので一応注意点を書いておきます。

あくまで初学者向け

ターゲットは初学者向けなので、既にディープラーニングをある程度知っている方にはやや物足りない内容かもしれません。 GitHub - udacity/deep-learningを見て自分のレベルに見合うものかどうかを確認すると良いかと思います。

そこそこの学習コストがかかる

大体週8時間ぐらいは学習する必要があるかと思います。英語が苦手だともう少しかかるかもしれません。 また、課題ごとにタイムリミットがありますので注意です。

多少のプログラミング知識が必要

講義は全てPythonで行われますので、プログラミング自体が初めてだと厳しいかと思います。また、数式はあまり出てきませんが行列計算と微分積分の基礎ぐらいは必要な気がします。

Programming knowledge needed: Basic to intermediate Python, experience with Numpy. Anaconda and Jupyter Notebooks.

まとめ

少し高いですが、Deep Learningを初めて学習するなら悪くない選択肢だと思います!

Udacityのディープラーニングのナノ学位基礎コースを受講します

ネットサーフィンしてたらUdacityがディープラーニングのナノ学位基礎コースを立ち上げ、399ドルで志願者全員入学の記事を見つけたので、受講してみることにしました。

ディープラーニングの基礎の基礎ぐらいは分かっていると思うのですが、どうも具体的なアプリケーションに落とし込むイメージが湧いていないのでそれの足がかりになればなと思います。あと英語勉強も一緒にやりたい。

時間あれば学んだ内容をまとめて記事にできればなと思います。

独断と偏見で選ぶHDFSのファイル形式

HDFSのファイル形式を何にすべきか、というのはRPGの主人公の名前を何にすべきか、と同じぐらい皆さん悩まれるかと思います。

ご多分に漏れず僕も悩みましたので、調べた事をまとめておきます。 なお先に結論だけ言っておきますと、大体のケースではORCをZlib圧縮して使っておけば良いんじゃないかなと考えています。マサカリは歓迎です。

※201701/21追記 EMR5.0以降ではHive + ORCで遅くなるケースがあるとのアドバイスをAWSのサポートの方から伺いました。EMRを使っている方はParquetとの速度比較をしてみたほうが良いかもしれません。

ファイル形式の候補

ファイル形式の候補としては大体以下が挙げられます。

各形式の特徴

それぞれのファイル形式の詳細な説明はここではせず、簡単な特徴だけ記します。なお、以下のサイトを参考にさせていただきました。

How to Choose a Data Format - Silicon Valley Data Science

hadoop - Parquet vs ORC vs ORC with Snappy - Stack Overflow

Mostafa Elzoghbi: Avro vs Parquet vs ORCFile as Hadoop storage files

  • ORCとParquetは共にカラムナー型でデータを保存でき、クエリの最適化に優れている。 また、圧縮効率も共に高い。

    • ORCはrow Indexやbloom filterが使えるので基本的にはORCの方が良い。ただしネストが深いデータ構造の場合はParquetの方が良い。
    • ImpalaはORCをサポートしていない
  • Apache Avroはカラム追加・削除・複数カラムのリネームまでサポートしておりカラム構造の変更に強い

  • SequenceFileはMapReduceのジョブに最適化されている。

  • TextFileは書き込みが早く、人の目で確認できるので管理しやすい。

ユースケースごとの使い分け

上記の特徴を考えると、ユースケースごとの使い分けとしては以下のようになります。

  • 単純にクエリを最適化したいならORC
  • ネストが深いデータ構造の場合やImpala使うならParquet
  • カラム変更に強くしたいならAvro
  • MapReduceジョブ最適化ならSequence
  • 読み込みのパフォーマンスがどうでも良いならText

ORCのファイル圧縮形式

HDFS上のファイルは圧縮する事で容量が減り、処理も効率的になる事が多いです。

ORCでは圧縮形式としてSnappyかZlibを選べます。昔は圧縮効率ならZlib、書き込み効率ならSnappyという住み分けだったらしいですが、2015年あたりにZlibのアルゴリズムが新しくなってからは書き込み効率にそこまで差が無くなったので無条件でZlibで良いかと思います。

※実際100Gb程度のファイルでSnappyとZlibで書き込み速度を比較した際はほとんど差がありませんでした

参考 Snappy vs. Zlib - Pros and Cons for each compression in Hive/ Orc files - Hortonworks

ORC: 2015 Faster, Better, Smaller

まとめ

Hadoopを使いたいときは大体HiveやPrestoなどのクエリエンジンとセットで使うと思うので、基本的にはZlib+ORCで良いと思います!なおORCフォーマットの性能を活かしきるには設定値やデータ投入時に少し工夫が必要だと思っていますが、それは次回の記事で書こうと思います。