Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
bilzard opened this issue Dec 11, 2022 · 8 comments
Open

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

bilzard opened this issue Dec 11, 2022 · 8 comments

Comments

@bilzard
Copy link

bilzard commented Dec 11, 2022

こんにちは。

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

間違ったコード

study = optuna.create_study()

正しいコード

study = optuna.create_study(direction="maximize")
@bilzard
Copy link
Author

bilzard commented Dec 11, 2022

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

@nenaiko-dareda
Copy link
Collaborator

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

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

@bilzard
Copy link
Author

bilzard commented Dec 15, 2022

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

@bilzard bilzard changed the title 第1版1刷 3章: Optunaの最適化の方向が逆 第1版1刷: Optunaの最適化の方向が逆 Dec 15, 2022
@bilzard bilzard changed the title 第1版1刷: Optunaの最適化の方向が逆 第1版1刷のソースコードの間違いについて Dec 15, 2022
@bilzard
Copy link
Author

bilzard commented Dec 15, 2022

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
Copy link
Author

bilzard commented Dec 19, 2022

7-8章:

  • (間違い)7章、pp. 179-180 Optunaの最適化の方向の間違い。正しくは最大化すべき。
  • (修正提案)8章、pp. 202、「これは画像ピクセルが0から1の間の値をとる用に強制する」。この表現でも間違いではないと思いますが、ピクセル値の1なのか最大値の255に対応する1なのか不明確なので、後者である旨を補足してはどうでしょうか?

@nenaiko-dareda
Copy link
Collaborator

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

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

@bilzard
Copy link
Author

bilzard commented Dec 20, 2022

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

Footnotes

  1. https://adversarial-robustness-toolbox.readthedocs.io/en/latest/modules/estimators/certification_randomized_smoothing.html#art.estimators.certification.randomized_smoothing.TensorFlowV2RandomizedSmoothing.fit

  2. https://arxiv.org/abs/1902.02918

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

@bilzard
Copy link
Author

bilzard commented Dec 21, 2022

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

Footnotes

  1. https://github.com/oreilly-japan/ml-security-jp/blob/master/ch08/Chapter8.ipynb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants