Explore "Full-Stack" in depth!

情報系の専門学校で、今は機械学習に的を絞って学習中。プログラミングを趣味でやりつつ、IT系のあらゆる知識と技術を身に付けるべく奮闘中。

令和だし自身のやってること、やらなければいけないことを整理

目次

概要

元号、令和になりましたね。
あいも変わらず技術力が足りない私ですが、
これからも精進して強くなっていきます。

今回は 大きな節目ということで、
またもや 勉強計画を立てていこうと思います。

私はこの 定期的に振り返る事をとても大事にしていて、
勉強する中で常に具体的なイメージが持てると思っています。


ここ最近やっていること

まずは私の ここ最近やっていること
そして今何をしなければならないのかについて考えます。

後半に、その目標に向けた
具体的な取り組みを挙げていきます。

コンパイラ自作の実践

ついこの前まで
Rui Ueyamaさんの9ccを写経していましたが、

やっぱり自分で考えて実装しないと意味ないな
と思うようになりました。

理由には以下が挙げられます。

  • Goの力は身についても Cの勉強にならない
  • そもそも Cを描き慣れてない私にとってこれは問題
  • 何故なら Cコンパイラを実装しているから
  • 写経は 本質的に"受け身"であり 惰性に陥りがち

現在は drumato/ccomo
フルスクラッチによるセルフホストCコンパイラ
の実装に取り組んでいます。

C言語に慣れていなくてエラー出しまくってますが、
これこそ自分自身がやるべき勉強法だったと思います。

何が足りない?

以下列挙します。

  • 先述した通り C言語を用いた実装力
    • 特に○○ケース時の ベストプラクティスみたいな知見が足りない
    • セキュアなコード を書く意識を常に持つように
  • アセンブリプログラミングの知見
    • 特に セクション周りがあまりわかっていない。
    • できれば アセンブラ自作にも取り組みたいと感じている。
  • 最適化パス・中間表現等の知識
    • 圧倒的インプット不足だと思う。
  • バイナリ知識・技術
    • ELFフォーマットはまだまだ理解できてない。
    • ELFリンカ・ローダが何をやっているのか詳しく知らない。

AttnGAN風T2Iモデルの実装

正直 絶賛苦戦中ではあるんですけど、
サイボウズ・ラボユースの取り組みで行なっているものです。

AttnGANの模倣をすることがテーマではないので、
あくまで実装のイメージを掴むためではありますが、
CUB 等ではなく自身の用意したデータに転用するというのはそれ相応に難しいです。

今はようやく 全体のコードを書き終え
細かくデバッグ・修正を繰り返しながら
実際に学習、画像生成にチャレンジしてます。

機械学習プログラミングに関しては実装力皆無
という大きな欠点があるので、
少しずつ慣れながらやっていっています。

T2Iモデルだけでなく、他にもNLPでやりたい事があります。

  • 略語推定
    • CPU→Central Processing Unitのような感じ
  • 方言Bot、文豪bot
    • 方言Bot→そのまま。 標準語を方言に変換
    • 文豪Bot→ 人が書く文章には特徴がある。 それを真似た文章生成

等です。

何が足りない?

  • 理論・数理的理解力
    • 論文を読むのにも時間がかかりがち
    • 完璧に理解してないためにモデルのメリットが不明瞭
  • 圧倒的実装力
    • 機械学習プログラミングが本当に苦手
    • NN内を信号がどう形状変化しながら伝播するのかをイメージできてない

自作OS

これはすぐに取り組むというわけではないんですが、
今かなり興味のあることです。

低レイヤのプログラミングが楽しいと感じている今、
やっぱり 自作OSはやりたいですよね。

できれば 自作言語で作りたい…。


具体的な勉強計画

ここからは実際に上記に上げた足りない部分を改善する方法を考えます。

コンパイラ

C言語を用いた実装力

これについてはまず、
とにかくC言語でコードを書くということですね。

github.com

リポジトリを育てていく中で勉強していくつもりです。

今は C言語の中級以上の本 等に手を出すよりも、
もっと他にやりたいこと・やらなければならないことがあります。

この下ではいくつか技術書を取り上げて話を進めますが、
そのいずれも

今一番やらなければ行けない事というレベルで自身に必要な知識のみ取り上げます。

書籍学習によってC言語の力を身につけるのではなく、

www.jpcert.or.jp

www.jpcert.or.jp

www.kouno.jp

等のサイトを参考に、
実装を細かくブラッシュアップしながら行えればなあと思っています。

上記のサイトでは、
セキュリティ上問題のあるプログラムを改善するための
詳細な解説が記載されていたりします。

C言語の実装をしていく中で本当に意識しなければ行けないポイントなので、
慎重に、しかし積極的にエラーを出して学んでいきたいです。

アセンブリプログラミング

これについてもとてもシンプルで、
コンパイラの吐くアセンブリコードを正確にするためには
自身がアセンブリに精通している必要があると感じました。

単純にアセンブリをいろいろ書いてみるというのも勿論なんですが、
アセンブラの自作が一番勉強になると思っていますし、
事実Golangアセンブラの実装をやろうとしていました。

今はCセルフコンパイラが優先なので一度ストップしていますが、
やはりアセンブラ自作はこの一年間でやりたい事の一つですね。

最適化パス・中間表現の知識

要はコンパイラの理論ってことです。
私はどの技術書も使わずにコンパイラ自作の勉強をしているので、
恐らく体系的な知識を持てていないのでしょう。

これについて早急に技術書に取り組む、ということはないですが、
どこかで手を出さなければならないでしょうね。
どこかのタイミングで。

バイナリ知識

今一番身につけたい知識です。
リンカ・ローダの動きが理解出来るようになりたいと思いますし、
各セクションがどう構成されているのか、
OSはどのようにしてELFバイナリを実行しているのか
メモリマッピングの方法は?etc...

知りたいことはごまんとありますが、
GW明けから リンカ・ローダ本に取り組みたいと思います。

機械学習

理論・数理的理解力

これについては特に一朝一夕で身につくものではないので

まずは 数式・数学的概念から逃げないということですね。
これは普段から意識している事ですし、

drumato.hatenablog.com

drumato.hatenablog.com

drumato.hatenablog.com

ここらへんに書いたように、
*数理について逃げずに勉強することは自分のポリシーです。

圧倒的実装力

これもC言語と特に違いは無いですね。
Pythonで実装することをもっともっとこなすということです。

C言語と違って言語仕様を理解できていないということはないので、
本当に 機械学習分野のプログラミングに慣れていないというのが本当に大きいんですよね。

深層学習系のプログラミングにもっともっと積極的に取り組む必要があるのかもしれません。


参考にしたい書籍

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

大熱血! アセンブラ入門

大熱血! アセンブラ入門

低レベルプログラミング

低レベルプログラミング

リバースエンジニアリングバイブル ~コード再創造の美学~

リバースエンジニアリングバイブル ~コード再創造の美学~

ガベージコレクション 自動的メモリ管理を構成する理論と実装

ガベージコレクション 自動的メモリ管理を構成する理論と実装

型システム入門 −プログラミング言語と型の理論−

型システム入門 −プログラミング言語と型の理論−

  • 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
  • 出版社/メーカー: オーム社
  • 発売日: 2013/03/26
  • メディア: 単行本(ソフトカバー)
  • クリック: 68回
  • この商品を含むブログ (11件) を見る

コンパイラの構成と最適化

コンパイラの構成と最適化

12ステップで作る組込みOS自作入門

12ステップで作る組込みOS自作入門

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)


総評

やはり定期的に勉強計画を見直すのは大事ですね。