oreilly-japan / ml-security-jp

『セキュリティエンジニアのための機械学習』のリポジトリ
47 stars 9 forks source link

第1版1刷のソースコードの間違いについて #1

Open bilzard opened 1 year ago

bilzard commented 1 year ago

こんにちは。

第1版1刷で書籍に記載してあるソースコードの間違いを見つけました。 具体的にはp.58-59(3章)で、目的関数を正解率の平均としているにもかかわらず、optunaの最適化方向がデフォルトの最小化になっています。 正しくは最大化させるべきです。

間違ったコード

study = optuna.create_study()

正しいコード

study = optuna.create_study(direction="maximize")
bilzard commented 1 year ago

3.2.4, 3.2.5節の勾配ブースティング、AdaBoostのソースコードについても同様の誤りがあります。

nenaiko-dareda commented 1 year ago

ご指摘いただきましてありがとうございます!監訳者の新井です!

おっしゃるとおりですね、正誤表とサンプルコードへ反映いたします。

bilzard commented 1 year ago

ご回答ありがとうございます。 4.9章練習問題 p.128も同様の誤りを見つけましたので報告します。 (まだ全部読めてないので、見つけ次第の報告になります。)

bilzard commented 1 year ago

4.9節 p.129 LSTMモデルのアーキテクチャについて、このモデルは時系列を予測するのでなく、時系列のクラスを判別することが目的なので、LSTM層のアーキテクチャはreturn_sequences=Falseとするのが正しいように思います。 テキストの図4-34を見ても最終層の出力チャネル数が100になっています。今回は二値分類なので本来の設計意図では最終層においてチャネルが存在しないのが正しいのではないですか。

現状

model.add(LSTM(32, return_sequences=True))

修正案

model.add(LSTM(32, return_sequences=False))
bilzard commented 1 year ago

7-8章:

nenaiko-dareda commented 1 year ago

ご指摘ありがとうございます!

直近でまとまった時間がとれなくて心苦しいのですが、少しずつ直してまいりますので、もう少々お待ち下さい。 なお8章の箇所につきましてはカッコ書きなどで補足するのが今後の読者のためにもよいかなと思っております。

bilzard commented 1 year ago

8章 (おそらく誤り)p.206 『「平滑化された」分類器を訓練する』 - Randomized Smoothingにおけるsmoothed classifierは実際には推論時にベース分類器の分類結果をランダムサンプリングすることよって実現されています。したがって本文中で言及されているような『「平滑化された」分類器』という実体としてのモデルは存在しないため、パラメータの学習などは行われません。TensorFlowV2RandomizedSmoothing.fit()^2が行っているのは、原著論文^1の3.3節に記述されているようなベース分類器にノイズが加えられたサンプルを加えて学習するプロセスを行っているのだと思われます[^3]。したがって、『「平滑化された」分類器を訓練する』という表現は誤りだと思われます。

[^3]: ソースコードの該当箇所: https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/estimators/certification/randomized_smoothing/tensorflow.py#L155-L159

bilzard commented 1 year ago

8章のサンプルコードについて: 上のコメントと関連しますが、Randomized Smoothing のサンプルコード^1では異なるノイズの大きさでforループを回していますが、現状のコードではmodel, optimizer, loss_objectを最初に一度だけ宣言し、各ループで使い回しています。 一方で、各ループではベースの識別器の学習を実施しているため、これらを使い回すとループの後のステップでは前のステップで学習した重みを継続しており、一貫性のある実験結果になっていません。 したがって、修正案としては、model, optimizer, loss_objectを毎回のループごとに初期化する必要があります。