The jonki

呼ばれて飛び出てじょじょじょじょーんき

統計検定2級に受かるまでの記録

統計に苦手意識があって軽い気持ちで受けとくかぁ,と思い本日統計検定2級を受けてきました.一応受かったのでその備忘録を共有します. ちなみに2級はレベル的にはそんなに難しくないので準1級ぐらいじゃないと自慢はできませんが,基本的な知識が身につくので取っておいて損はないと思います.

お試しでStudy Plusで時間をこまめに測ってみました.8月のお盆頃から初めて4ヶ月ほどやってたことになります.後で書きますが,2級に受かるだけならもっと短くてもできる気がします.10月以降は引っ越したりロタウイルスにかかったりでだんだん勉強の頻度が下がってますね.

勉強内容(時系列)

勉強時間はざっと70時間ほどでした.こう聞くと長いですが,最近プレイしたゼノブレイド3と同じぐらいなのでゲーム1本分ぐらいと聞くとそうでもないように聞こえる不思議. 子供がまだ小さいので仕事終わりの夜しか勉強時間が取れず,1日の内30分〜1時間ぐらいが限度でした.

以下では勉強した内容を時系列に沿って説明していきます.

// 論文という項目がありますが今回関係ないです.論文読む時間も記録しようと思ってすぐやめた記録が残っています.

ベルカーブ統計ウェブ

色々調べるとこれだけで受かったという人もいました.内容的には導入から合格まで十分カバーしています.大体2級レベルまでですが,2級以上の内容も少し含まれています.とりあえず統計ウェブの「統計学の時間」を最初から最後まで読みました.万人におすすめできます.

bellcurve.jp

コアテキスト統計学

次に統計ウェブを運営する会社でも社内参考書として使われているらしいこちらの本を読みました.統計検定2級のためだけだったらこれはスキップしても問題ないです.ただ統計入門として非常に良書だと感じました.検定を受ける気はないけど統計を基礎から勉強したい,という人には非常におすすめです.

過去問

このあたりでそれなりの時間が経ったのでそろそろ過去問をやろうと思い,2021年6月の最新の過去問を1回分やりました.ただ結果は散々たる結果.後で気づいたのですが,2021年6月は最難関でやらなくてもよいレベルでした.良問ではあるのですが,明らかに過去より難しいです.

そんなことは知らず一度自信を失い,もう一度ベルカーブの統計ウェブを見直しました.

ヨビノリ

Youtubeでたまたま見かけたヨビノリシリーズに【推定・検定入門の連続講義一覧(全9講)】というのがあったので倍速で見ました.こちら最初に見ても良いかもしれません.

www.youtube.com

過去問

ここで5回分の過去問をやりました(上のと合わせると計6回).上の統計ウェブでも解説がありますが,昔の方の試験の方が簡単に思えました.3回目ぐらいから合格点に達したので,統計検定の申し込みをしました. 最初の2,3回は時間を気にせず解いて,それ以降は時間を測って解くようにしました.最後まで終わらない,ということはなかったですが,そんなに時間に余裕もできないのでわからない問題は勘で選ぶ必要があります.

間違えた問題は後でやろうと思いチェックを付けていましたが,時間が取れずやり直しはしていません(おい).

とけたろうさんのチートシート

最後の1週間は復習でチートシートを探し,とけたろうさんのが良かったのでこちらを見ました. 理解が怪しいところは,各講のページを開いて内容を確認しました. 統計ウェブではなく,とけたろうさんの統計検定2級対策だけでも良かったかもしれません.

www.youtube.com

toketarou.com

CBT対策

統計検定2級はCBTというパソコンで受けるタイプの受験ができて便利です.適当に家に近いパソコン教室とかを選び受験できます.受験可能日はたくさんあるので落ちても少し時間を開ければ再度受けれます. ただ何点か注意.

  • 計算用紙,筆記用具は自分のものを使えない.

    • 私の場合はA4の紙を2枚とボールペンを与えられました.これは実はアタリでラミネート加工紙と水性ペンが与えられる場所もあるようです.使いにくそう.
    • 過去問を解くときはA4用紙に小さくコンパクトに途中式等のボールペンを使ってメモをする練習をしておいたほうが良いです.用紙の追加は不可ですがスタッフを呼び出せば用紙の交換はしてもらえます.ただ試験時間が短いのでできれば避けたいです.
  • CBTは液晶ディスプレイに問題が出るので普段の過去問とギャップが有る.

    • 過去問は本なので計算用紙の隣で解けますが,CBTは前面の液晶と手元の計算用紙という形で視線移動が多くやりづらかったです.
    • 細かい値の計算など,ケアレスミスが出やすいので画面を指差し確認等しながら解くのがおすすめです.過去問への書き込みはしないで解けるようにしましょう.
    • あとパソコン教室の液晶ディスプレイの解像度がしょぼくて文字が読みにくかったです笑
  • 周りがうるさい.

    • 私はデパートの一角のパソコン教室だったので館内放送や事務スタッフの喋り声などが普通に聞こえる環境でした.
    • 耳栓で集中する癖をつけとくとよいです.私の行ったところでは耳栓をくれましたが,マイ耳栓を持っていったほうが良いと思います.

買ってよかったもの

関数電卓とかでなければ大体何でも良いのですが,カシオのこれがかっこよかったです.使いやすい. メモリー機能は知らなかったのですがこれを機に覚えました.

こちらはストップウォッチ目当てで.どうしても子育て中はまとまった時間がとれないので,これで過去問の時間を計測していました.

こちらは以前からもっていたタイマー.ポモドーロテクニック的にアナログで集中時間をセットできるのがよいです. 上のドリテックと同じですが,スマホを開かなくて良いのがミソ.

まとめ

以上,統計検定2級の記録共有でした. 勉強時間の記録とか性格に合わないのですが,資格モノだと期限を決めてがんばれました.後々に記録が見れて結構面白いです. 次は準1級を...とは思っていないので,また別のことをやろうと思います.

HHKB Professional Hybrid Type-Sを手放した

HHKB Professional Hybrid Type-SからKeychron K2を使っていたのは下記の通り.すっかりHHKBを使わなくなっていたので手放しました.戻らなかった決定的な理由について書いておきます.ちなみにこれはあくまで個人の感想ですので,優劣をつけたいわけではありません.

www.jonki.net

手放した理由

単3電池は面倒くさい

HHKBでは省エネモードがあるのですが,30分以上キー操作を行わない場合,スリープモードになってしまいます.ここから復帰するためには電源ボタンを長押しする必要があり,キー入力できるまで10秒ぐらいかかり面倒です.静電容量式でなければ適当にキー入力すれば再接続となる場合が多いので(たとえばThinkpad BTキーボード)これは痛い.省エネモードを切るとスリープモードにならずに済みますが1ヶ月程度しか電池が持ちません.単三電池をわざわざ外して入れ替えて...というのは面倒です.一方でUSB-Cでさくっと充電できるKeychronはやはり便利です.リチウムバッテリーが10年以上持つか?というと多分NOなんですが,新しいキーボードを使ってるだろうし,耐久性は犠牲にできるかなと思っています.

キーが少ない

やっぱりキーが少ないです.特にファンクションキーと矢印キーを直接打てないのが厳しいです.個人的には最近VS Codeデバッグにファンクションキーをよく使うので指1本で打てた方が指の疲れが少なく嬉しいです.Keychron K2はHHKBより気持ち大きいぐらいでこれらのキーがつくので大分便利です.

Win/Macの切り替えには工夫がいる

上の2つほどクリティカルではないですが重要です.KeychronにはWin-Alt / Cmd-Optの位置を入れ替えられる物理スイッチが付いており簡単に切り替えられます.在宅勤務だと会社のWindowsと家のMacの切り替えが必要になるのでこの機能はありがたい.キーバインドを変えるソフトでWinかMacをいじれば良いんですが,最近はデフォルト設定厨なのでなるべく何もやりたくないのですよね.

次のキーボード

Realforce R3のUSキーボードが出たので気になるところですが,これも単三電池式でバッテリーが1ヶ月程度ということでHHKBと同じ感じかなぁと思ってます. セパレートキーボードも探していますが,キーがみんな少ないんですよね.Ergodoxは一方でデカすぎなのでちょっと邪魔.Keychronが気に入ったので80%キーボードで赤軸以外を触っても良いかなと思っています.

オチはありません.

PyQtGraphでソフトウェア・シンセサイザーを作って遊んでみた

f:id:jonki:20220220215242p:plain

ピアノは弾けないのに最近シンセサイザーに興味があり,KORG Volcaシリーズで遊んでいました.今年は勉強がてら遊びも入れたコードを書きたいなと思っていたので,どうせなら勉強がてらソフトウェアシンセサイザーを書いてみようと思い書き始めました.できたのがこんなアプリで,MIDIキーボードから操作しています.

github.com

www.youtube.com

やったこと(やりたかったこと)

今回やりたかったのはこんなところです.ステップ・シーケンサまで出来ると良かったのですが,GUI含めてかなり大変そうだったので今回はやっていません.シンセのフィルター機能も無限に色々あるのですが,かなり単純なところを実装しました(といっても後述紹介するブログのシンセコードをほぼそのまま使っています).またPyQtやPyQtGraphのGUIコーディングや信号処理周りに不慣れだったので中々大変でした.

  • 信号処理周りのコーディング
  • インタラクティブに音を鳴らして楽しくシンセ遊びができる
    • 基本的な信号波形の選択と再生
    • エンベロープ・ジェネレータ(Attack Decay Sustain Release)を可視化しつつ反映
    • Low Frequency Oscillator で信号を揺らす
  • ステップ・シーケンサ機能(音楽上のステップのシーケンスと音の記録による簡易的な作曲機能のようなもの) // 今回断念

ざっくりと振り返り

ちなみに実は今回のコードのシンセ部分は下記の素晴らしいブログを使っているだけです.全3回ですが,かなり読み応えあって面白いのでおすすめです.細かい解説はそちらにゆずるとして,ざっくりとここでは開発経緯やシンセの内容に触れます.書いといてなんですが,エンベロープジェネレータやLFOのコードに関してはここの記事だけをみても多分よく分からないかなと思います.

python.plainenglish.io

プログラミング言語及びGUIの選択

これは結構悩んだのですがPythonPyQtPyQtGraphという構成にしました.実は今回の勉強を除く用途だとWebが最も適しています.GUIの自由度は高いし,Web Audio APIがかなり優秀なのでこれを使ったほうが絶対に良いです.今回は直接信号を生成したり編集したかったので使わなかったので書き慣れたpythonを選択しました.が,やはりGUIpythonだと厳しいです.そもそもGUIライブラリが充実しておらず,高フレームレートで複雑な描画ができるのはPyQtGraphぐらいしか見当たりませんでした.今回Qtベースにしましたが,Webに比べるとGUIパーツの選択肢の狭さや使い勝手の癖など個人的にはあまり楽しい感じのものではなかったです.ただ見た目はさておきGUIとして求められる基本的な機能は十分でした.1点注意として,PyQtはソフトウェアライセンス的にはGPLでコードの公開が必要とのことで,その問題を回避したPySideというのが機能がほぼ同じ?であるようです.今回はプライベートなのでフル公開でまったく問題ないですが,企業などで使う場合は注意が必要です.

ソース波形の生成

Oscillatorが基本となる波形を生成します.学校だと普通勉強するのはsin波だと思いますが,これは単一周波数成分しか乗っておらず聞いても面白くないです.音楽的にはのこぎり波,矩形波三角波のような倍音が多く乗った成分の方が派手で楽しいです.

これは最終的に使っているコードではないのですが,仕組みとしてはここのsinオシレータがわかりやすいです.物理現象としては分かっていてもコードにどう落とすんだ?となるところですが,pythonだとitertools.countが無限にステップを刻んでくれるところを値を指定個数分yieldする形で実装します.

def get_sin_oscillator(freq, amp=1, phase=0, sample_rate=44100):
    phase = (phase / 360) * 2 * math.pi
    increment = (2 * math.pi * freq)/ sample_rate
    return (math.sin(phase + v) * amp for v in itertools.count(start=0, step=increment))

osc = get_sin_oscillator(freq=1, sample_rate=512)
samples = [next(osc) for i in range(512)]

エンベロープ・ジェネレータ

エンベロープ・ジェネレータとは波形の概要を形成するものです.Attack時間,Decay時間,Sustainレベル,Release時間が決まれば,音の鳴り始め〜鳴り終わりを定義できます.今回は最も単純なエンベロープを適用していて,GUIと連動して分かりやすくしています.ちなみにSutainだけは時間でなく相対的な音量レベルです.鍵盤をどれぐらい押し続けるかは分かりませんからね.

f:id:jonki:20220220221650p:plain
ADSR

エンベロープ・ジェネレータは Envelopeクラスで実装されています.ads_stepperr_stepper というのが肝です.ここでもitertools.count を使うことで.指定したAttack/Decay/Releaseの時間を刻むフレームを作っています.ここではads_stepperのコードを持ってきました.Attack → Decayへとwhileループとyieldを使って切り替えています.

    def ads_stepper(self):
        attack_stepper = itertools.count(
            start=0, step=1 / (self.attack_duration * self.sample_rate))
        decay_stepper = itertools.count(
            start=1,
            step=-(1 - self.sustain_level) /
            (self.decay_duration * self.sample_rate))
        while True:
            if attack_stepper:
                val = next(attack_stepper)
                if val > 1:
                    attack_stepper = None
                    val = next(decay_stepper)
            elif decay_stepper:
                val = next(decay_stepper)
                if val <= self.sustain_level:
                    val = self.sustain_level
                    decay_stepper = None
            else:
                val = self.sustain_level
            self.val = val
            yield val

LFO

Low Frequency Oscillatorと言われるもので,ベースの波形に対して時間的な変化(振幅や周波数)を与えるものです.LFOが出来ると所謂シンセっぽい音になるので,ここが一番楽しいかもしれません.例えば振幅をsin波で揺らせば「ホワンホワンホワン」という音になり,矩形波で揺らせば「ピーポーピーポー」とサイレンっぽくなります.更に周波数も何らかの波で揺らせばかなり複雑な音に変化します.これは ModulatedOscillatorクラスが担当します.指定したモジュレーション関数に対して値を投げて波形を変化させています.

    def _modulate(self, mod_vals):
        if not mod_vals:
            return
        if self.amp_mod is not None:
            new_amp = self.amp_mod(self.oscillator.init_amp, mod_vals[0])
            self.oscillator.amp = new_amp

        if self.freq_mod is not None:
            if self._modulators_count == 2:
                mod_val = mod_vals[1]
            else:
                mod_val = mod_vals[0]
            new_freq = self.freq_mod(self.oscillator.init_freq, mod_val)
            self.oscillator.freq = new_freq

やり残していること

これもシンセによくあるローパスフィルター(LPF)を実施したのですが,フィルター適用により結構ノイズが乗ってしまっています.周波数特性を考えるにあたりノイズや計算量のバランスなど考えてフィルタを設計する必要があると思うのですが,今回はそこまで時間が取れず次回の課題にしようと思っています.LPFといってもいろいろなフィルターがあり奥が深いです. - Python NumPy SciPy : デジタルフィルタ(ローパスフィルタ)による波形整形 | org-技術

まとめ

中々不慣れなことが多く大変でしたが,1つキリが良いところでまとめられてよかったです.シンセサイザーモジュレーションに関しては組み合わせは無限にあり,そのコーディング部分などなかなかトリッキーに実装していて面白かったです.

MacBook Pro(M1 Pro)とColab Proでディープラーニング

はじめに

年末年始に少し時間があったので,趣味で書いているコードを動かすGPUインスタンスについて調べていました.以前はちゃんとGPU持っていたのですが,あまり使っていなかったので全部売っていました.買い直しも検討しましたが,未だにGPUは高いですし,我が家の冬は暖房等の使いすぎでブレーカーがよく落ちるので,何か適当なクラウドサービスを使おうかなと思っていました. AWSの安いGPUインスタンスであれば1時間100円ぐらいなので悪くはなさそうでしたが,時間課金はソワソワしちゃうので辞めました.そこで日本でも使えるようになった月額1000円程度のColab Proを使い始めました.

この記事ではMacbook Pro (M1 Pro)とColab Proを使ったディープラーニングの開発に関して,そのワークフロー,ベンチマーク,Tipsを簡単にまとめたので共有します. Colabはこれまで簡単なpythonのコードチェックぐらいでしか使ったことないですが,今回本格的に使い始めたので共有します.もっといい方法あるよ!という方はぜひコメント下さい.

Colab Proについて

Colab Proは最近日本で使えるようになったGoogleのサービスです.詳しくは下記の記事が詳しいです.月1000円程度で通常のColabよりGPUインスタンスが長く使えるのが特徴です.Pro+にすればGPUがP100からV100と更に良くなり(RAMは16GB → 32GB!),バックグラウンド実行もできるようになります,月5000円ぐらいかかるので本格的な人向けです.

atmarkit.itmedia.co.jp

ベンチマーク(M1 Pro vs Colab vs Colab Pro)

結局一番気になるのは学習速度.実はM1 Pro,素のColab (K80)より早いやんという話もあり調べてみました.ちなみに私のM1 ProはM1 Proの中でも最弱です(コア数という意味で). Colab上で試したのはTPUでなくGPUインスタンスです.計測のためのコードはpytorchの公式例をそのまま使い,MNISTの分類と言語モデルを試しました.Linear, CNN, RNN系のコードです.計測では1つのミニバッチの処理時間をまとめてみました.M1 Pro比でどれぐらい早いかカッコ内に書いてあります.

モデル M1 Pro (8 cores) Colab (Tesla K80, 12GB) Colab Pro (Tesla P100, 16GB)
MNIST, batch_size=64 0.028s 0.007s (4x) 0.003 s (9.3x)
LM (RNN, batch_size=20) 0.113s 0.006s (18.8x) 0.003s (37.7x)
LM (RNN, batch_size=100) 0.449s 0.162s (2.8x) 0.044s (10.2x)
LM (Transformer, batch_size=20) 0.103s 0.009s (11.4x) 0.005s (20.6x)
LM (Transformer, batch_size=100) 0.432s 0.160s (2.7x) 0.044s (9.8x)

M1 Proはこの中だと一番遅いですが,意外と早いですね.本格的な学習には厳しいですが,動作確認程度なら全然問題なさそうです.K80はM1 Proより遅いと思っていましたが,意外と奮闘していますね.P100はちゃんと早いですね.P100は2080Tiにやや劣るぐらいのFLOPSだけどメモリは多い,というものなのでなかなか悪くないと思います.RAM 16GBというのは中々絶妙で昨今では10GBぐらいでは足りないケースも増えてきたので16GBはありがたいです.これぐらいメモリが載ってるものってコンシューマー向けには3090とかになってしまうので中々手が出ません.一方でColab Proは実行制約等があるものの,電気代気にせず1000円というのは趣味用途では全然ありだと思いました.まず素のColabで運用して物足りなくなったらProにするというのもアリだと思います.

ベンチマーク等についてはこちらもご覧ください.

開発構成について

次はColab Proを使った際の開発構成の紹介です.以下のようにして落ち着きました.Colab上では学習したモデル等のデータは自分で保存する必要があるため,Google Driveとの連携は必須です.またノートブック上で本格的なコーディングはかなり辛いので,Google Drive上でコードを管理し(github),通常時はローカルのマシン(Macbook Pro)上でVisual Studio Codeで開発,というのが良さそうでした.

  1. Google Drive上を作業スペースとし,ここに自分のプロジェクトをgit cloneする.
  2. 通常開発時はMacbook Pro上で作業し,学習コードがちゃんと動くかM1 Proでチェック(私はVisual Studio Code使ってます).
  3. 学習を本格的に開始する段階で,Colab ProでGPUランタイムのノートブックを作成する.
  4. Colabのノートブック上でGoogle Driveをマウントし,プロジェクトディレクトリにchange directoryする.
  5. Colab上で学習を開始する.(例:! python train.py
  6. tensorboard等を使っている場合は,ノートブック上でtensorboardを使うか,ローカル側で自分でtensorboardのサーバーを立ち上げる.Google Drive上で作業しているのでログもsyncしており,ローカルでtensorboard立てられる(私はこれ).
  7. コードに修正があれば,手順2に戻る.

開発Tipsについて

いくつか覚えていて損がないことを書いておきます.

Google Driveのマウント

これはGUIとプログラムの2通りでマウントできます.GUIから行く場合は,左のサイドメニューのフォルダアイコンをクリックしてから辿れます.プログラムから行く場合は下記のような形でいけます.

from google.colab import drive
from pathlib import Path

def mount_drive():
    drive_path = Path('/content/drive')
    if not drive_path.exists():
        drive.mount(str(drive_path))

mount_drive()

Githubからprivateなリポジトリをcloneする

GithubのPersonal Access Tokensを使えば,自分のprivateリポジトリであっても簡単にcloneできます. Githubのページで Settings → Developer settings → Personal access tokens で full control of private repositoryトークンを生成しておきます. Creating a personal access token も参考にしてください.

そしてノートブック上で以下のようにしてcloneできます.簡単ですね.

import os
os.chdir('<your_work_space>')
%env TOKEN=<YOUR_TOKEN>
!git clone https://$$TOKEN@github.com/<user_name>/<repo_name>.git

実行環境がColab上かどうか判定する

これはローカルでの開発とノートブック上での開発で処理を切り替えたいときに便利です.

import sys
is_colab = 'google.colab' in sys.modules

ローカルとノートブック上でのファイル同期について

基本はGoogle Drive上で作業しているので,ファイルは勝手に同期されます.ただ手元で編集してすぐに反映,というわけにはいかないです.感覚的なものですが,数分ぐらいラグがある気がします. また同期されているつもりでノートブック上で実行したところ,古いコードが動いていた,ということもあるのでノートブック上でのコード確認は重要です. ただ結構面倒なので変更はすべてgit commit & pushしておき,ノートブック上ででgit pullしてから実行するようにした方が便利です.

Terminalどう?

Colab Proの目玉機能の1つではあると思うのですが,遅延が結構ひどく,インスタンスが再生成される度にルートディレクトリにcdしてしまい,正直使い勝手はよくないです.psnvidia-smiなどのプロファイル系のコマンド実行には良いかもしれませんが,思ったより使わないです.デフォルトでtmuxが動くのは良いのですけどね.重要な処理やノートブックのセル上で書いたほうが確実に実行できます.

ノートブックはターミナルのように利用する

ノートブック上でのpythonコードもかけるのですが,基本的に私は書いていないです.普通に.pyをVisual Studio Codeでコーディングしておき,ノートブック上はひたすらgit,前処理,学習の実行といった適当なファイルの実行を行っています.データ分析等の可視化をする場合は便利だとは思います.

自動接続

これはabuse感あるのですが,よくあるTipsとして紹介されています.ブラウザのDeveloper consoleを開き,以下のように再接続ボタンを継続的に押すようにスクリプトを仕掛けておきます.

function KeepClicking(){
    console.log("Clicking");
    document.querySelector("colab-connect-button").click() }
setInterval(KeepClicking,60000)

実行時間と再学習について

Colab Proでは最大実行時間は無料プランの倍の24時間になっていますが,通常のColabを常用していた訳ではないので体感的に伸びているかはよく分かりません.基本的には寝る前,起きたとき,午後,でノートブックをチェックして実行が止まっていたらノートブックのセルをRun allする感じです.特定のディレクトリの最新チェックポイントを自動でresumeするようなコードにしておくのが良いと思います(例: python trainer.py --resume ./your_exp_dir).ただ面倒であることは変わりないので,ある程度学習がうまくいくことが分かっている場合は,AWS等で専用のGPUインスタンスを立てても良いかなと思います.

まとめ

M1 ProとColab Proを使ったディープラーニング開発についてまとめました.Colab Proを単純なGPUインスタンス的に扱う,という用途でも使い物になりそうです.趣味でこれは結構良いと思いました.自前のGPUを使う場合,そのためのマシンを用意する必要がありますし,電気代も場所も取ります.GPUもそもそも毎年新しいものが出てくるので,サブスク性や従量課金制の方が今どきは良いなと思いました(もちろん用途によります).そういう意味ではColab Proはランチ1回分と考えるとかなりお買い得だと思いました. またM1 Proがまぁまぁ早いのも想定外でした.このMacbookで本格的な開発をする予定はなかったのですが,これならM1 Pro Maxを視野に入れてよかったなとちょっとだけ思いました.

2021年にやってよかった技術書(数学,機械学習関連)と読書習慣について

今年もこの季節... www.jonki.net

今年は子供も生まれて本を読む時間もないか...と思いましたが,時間的制約が加わることでむしろ例年より読んだかなという気がします(それでも多くはないんですが). でも継続的に読むという習慣はできた気がします.

個人的に良かった読書習慣のコツ

  • ちょっとずつで良いので毎日同じ本を読む(ただし体調不良のときはちゃんと休む).
  • 読むページ数は安定している方が良い(一気に読もうとしない.ページ数は本の難易度に合わせて調整すれば良い).
  • 習慣記録系のアプリを使わない.連続読書記録を作ることが目標でないし,記録が切れると燃え尽きて戻れない可能性がある.
  • 同時に読む本は1冊で良い.増やすならいずれもバランス良く読む.
  • 紙媒体で読んだほうが読み進めるほどに達成感が増して良い.
  • 本の評価が高くても自分に合わないと感じたら無理せず諦める(大丈夫,他にも良い本はいっぱいある).

以下いくつか読んだ中でおすすめしたい本だけ紹介します.正直ほとんど有名な本なので特に新しい情報はないですが.

ストラング:線形代数イントロダクション + MIT 18.06 Linear Algebra, Spring 2005

線形代数まるでわからん状態が続いていたので,色々読み漁った結果これが良いと判断しました.巷には色々教材が溢れていますが,小手先の計算テクニックとかでなく,体系的に学ぼうとするならこのGilbert Strang先生のMITの授業が無料で公開されていて内容は素晴らしいと思います. ちなみに第1回の講義は87万回再生されていて,一番少ない回でも5万回程度あるので数万人が通しで見ているんだと思います. 動画見て頂くと分かるんですが,Andrew Ng先生とはまた異なる形で引き込まれる授業です.具体的な事例に対して自問自答して解き明かしていく形でかなり分かりやすいです.英語も字幕が丁寧についていますし,先生の英語はかなり聞き取りやすいです. ちなみに書籍の方は600ページを超える鈍器なのですが,一般的な数学の教科書というよりは,授業のライブ感をうまく書籍に対応させたものになっています.動画をいくつか見る→本の対応するところを見る,という形で進めていくと読みやすいと思います. 部分空間に対する重きの置き方など,この授業はよくある線形代数の教え方とは異なる視点で授業を展開している気がします.なので書籍だけを読んで勉強する場合は若干とっつきづらいかもしれません.ただ翻訳書にありがちな直訳英語は特に感じず,脳内でストラング先生が喋ってる声が聞こえるぐらい邦版は素晴らしい出来だと思います.また100ページ以上は問題演習なのも面白いです.個人的には全部やりたいと思いつつ,まじめに100%読もうとして途中で頓挫するのも嫌だったので,練習問題は飛ばして例題までにして読むようにしました.かなり分厚い本ですが,見た目ほど苦労はせず読める本だと思います.

www.youtube.com

ちなみに同じくストラング先生の18.065というデータ分析向けの授業(2018年)も公開されているので次はこれを見ようと思っています.日本語版の書籍も今年の10月に出たばかりのようですね.

これなら分かる最適化数学,金谷健一

昔買って積読していたのですが,数学力上げたくて読み始めました.極値と勾配,最小2乗法,最尤推定など全般的に事例と説明が秀逸でした.学部の頃に読んでおきたかった超絶良書です.Andrew Ng先生のCS229に近いカバー範囲だと思いますし,いわゆる機械学習に関する数学力を上げたいのであれば今回紹介する中では間違いなく一番オススメです.

これなら分かる応用数学教室,金谷健一

上述の金谷先生の本がめちゃくちゃ良かったので同じく積読していたこの本も読みました.最適化数学と被るところもありますが,フーリエ変換固有値問題が追加・充実していてよいです.何より同じ著者なので説明方法や式展開の癖が同じなので連続して読みたいところ.

情報理論のエッセンス,平田廣則

マシンラーニング系の論文などを読んでいるとエントロピーの話がよく出てきます.情報の数量化,つまり情報量に関する知識は一度振り返ってもよいかなと思い読みました.後半は符号化の話などが多くなってきますが前半だけでも読む価値はあると思います.今回紹介する本の中では一番サクッと読める本です.

続・わかりやすいパターン認識教師なし学習入門―,石井 健一郎, 上田 修功

これも積読していた有名本です.ひたすらサイコロを振ってその過程をベイズで捉えていた気がします笑.須山さんのベイズ本等と合わせてこの本を読んでも良いかもしれません.個人的にはHMM,EMアルゴリズム,前向き・後ろ向きアルゴリズムあたりの説明がかなりしっかりしている本でした.私の中で殿堂入りしている高村先生の「言語処理のための機械学習入門」でも言語ドメインにおけるこのあたりの説明があるのですが,この本ではそれを一般化して説明しており,合わせて読みたいところです.

まとめ

以上,前年度に続いて基礎的なところが多かったなという印象です.ほぼ毎日本読む習慣ができたのも良かったですね.ただ本を読むときは紙とペンを持って自分でも手を動かして確認することが大事なんですが,結構サボった気がします.来年はもうちょっと丁寧に読んでいきたい. ちなみにストラング先生の授業,学部向けで2005年なんですが,私もこの頃大学1年生なので感慨深いものがありました(線形代数の授業を何も覚えていない悲).