Open victor-von-pooh opened 8 months ago
秋田が就職することに伴って, 平日の稼働率が下がります. まだどれくらい出来なくなるかは分かりませんが, ご理解のほどよろしくお願い致します.
秋田が1年半ほど在籍していた長期インターンの紹介です.
社名 : ギリア株式会社 事業内容 : 独自技術による高性能・高品質なAIソリューション開発 クライアント例 :
オフィシャルサイトはこちらから.
実案件を通じてAIを駆使した問題解決のフローを学ぶ. 最新の技術に触れ, それを自分たちで構築する.
契約期間は原則6ヶ月以上. 主に在宅なため全国から参画可(出社の場合は御徒町のオフィス, 東京都台東区台東4丁目19−9 山口ビル 7 8F). 雇用形態はアルバイト. 給与は時給1200円から. 交通費支給, PC(Mac)の支給あり.
応募フォームはこちらから.
深層学習(Deep Learning)についての基礎的な知識が学べる書籍の紹介です. 現在, この分野における最も多く使われている教科書的な役割を持つ書籍はこちらです.
「ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装」
中には自分でゼロからニューラルネットワークを作るためのコーディング方法も記載されていますが, 普通はゼロから作らず PyTorch や TensorFlow といったライブラリを活用するので, この本はニューラルネットワークの基礎理論を学ぶことに使うのが良さそうです.
先ほど、5/1(水)20:00-21:30ということで、招待を送らせていただきました. 直前で申し訳ありません.ご確認の程よろしくお願いいたします.
了解しました. 秋田の理科大支給の Zoom のアカウントが無くなったため, ミーティングの設定はとこさん側からお願いします.
おはようございます. ただいま,招待が送信されたかと思うので,ご確認の程よろしくお願いいたします.
夜分に失礼いたします.
ニューラルネットワークについて,動画の視聴が完了いたしました.
また,同じようにコードを組み,practice_pytorch.ipynb
としてコミットしたので,ご確認いただきたいです.
一点質問なのですが,
・すでにphase == "Train"
を指定している中で,さらにif分岐でphase == "Train"
とするのはなぜでしょうか.
with torch.set_grad_enabled(phase == "Train"):
outputs = model(inputs)
loss = criterion(outputs, label) ** 0.5
# 逆伝播を行う
if phase == "Train":
loss.backward()
optimizer.step()
以上,よろしくお願いいたします.
お疲れ様です. 動画のご視聴ありがとうございます. 質問についてご回答させていただきます.
phase == "Train"
を指定している中で,さらにif分岐で phase == "Train"
とするのはなぜか順を追ってご説明します.
torch.set_grad_enabled(phase == "Train")
とは, set_grad_enabled()
メソッドの引数が True
のとき, 勾配を計算するというものを意味しています.
今回であれば, phase == "Train"
のとき(学習モードのとき)のみ勾配を算出するという命令を下します.
つまり, この with 構文の中では phase == "Train"
のときのみ勾配が計算されるということです.
この with の中の処理そのものは学習モードでも検証モードでも行われることになります.
ただし, 検証モードのときはそもそも誤差逆伝播をしないので, if phase == "Train":
で分岐を入れる必要があります.
これを学習モードと検証モードに分けて記述すると, 例えば次のようになります.
if phase == "Train":
with torch.set_grad_enabled(True):
outputs = model(inputs)
loss = criterion(outputs, label) ** 0.5
loss.backward()
optimizer.step()
else:
with torch.set_grad_enabled(False): # ここは書かなくても良い
outputs = model(inputs)
loss = criterion(outputs, label) ** 0.5
元のコードに比べ, 同じ処理が分岐で重複し, 冗長になってしまいますね.
これを学習モードと検証モードに分けて記述すると, 例えば次のようになります.
まさに,なぜそのようなコードにならないのか,と考えていたところでした. 書き方にはまだ慣れませんが,冗長さを避けるための工夫であり,本質的には同じ意味なのですね.
ありがとうございました.
practice_pytorch.ipynb
ファイルを確認しました. PyTorch の使い方としては非常に理解が進んでいるという印象です.
細かい粒度でのコメントは以下の通りです.
to_torch()
関数の型指定prepare_nn()
関数内の StandardScaler()
の扱いについてまず, to_torch()
関数の返り値なのですが, すみません, set
ではなく tuple[torch.Tensor, torch.Tensor]
ですね.
次に, prepare_nn()
関数内で StandardScaler()
を使っていますが, 全てに標準化を適用してしまうと, 目的変数を元のスケールで評価出来なくなってしまいます.
すなわち, 本来 4745.78
であるのに 4755.78
と予測した場合にも, 標準化後のスケールでの差になってしまうので, 10
の差が例えば 0.01
の差などになり, MSE をかけたときに実際より非常に精度が良くなってしまうという現象が起きます.
後に StandardScaler().inverse_transform()
メソッドをかける必要が出てくるので, 返り値に std_x
と std_y
は必須です.
さらに StandardScaler()
は確か Tensor
型には対応していないので, df
として X_train
, y_train
, X_valid
, y_valid
, X_eval
, y_eval
の情報は返せるようにしたいところです.
self.linear_relu_stack = nn.Sequential()
についてnn.Sequential()
の中身の次元操作を柔軟にしたいので, 次のようにすると良いと思います.
class NeuralNetwork(nn.Module):
def __init__(
self, input_dim, output_dim,
first_dim, second_dim
):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(input_dim, first_dim),
nn.ReLU(),
nn.Linear(first_dim, second_dim),
nn.ReLU(),
nn.Linear(second_dim, output_dim)
)
def forward(self, x):
x = self.flatten(x)
outputs = self.linear_relu_stack(x)
return outputs
ここで std_y
を使って予測値を本来の標本空間上に引き戻してあげる必要があります.
ご確認ありがとうございます. 修正の結果,下のような図が出力されました.
ここで疑問なのですが,「目的変数の正規化」が必要なのはなぜでしょうか. 必要性を考えずにここまで進めてしまい,申し訳ないのですが,お答えいただけたら幸いです.
よろしくお願いいたします.
図に関して, correct
ラベルが直線になっているのは違和感がありますね. 何かおかしなことがないか確認してみてください.
prediction
については元の画像のスケール違いとなっていそうなので良さそうですね.
ここで疑問なのですが,「目的変数の正規化」が必要なのはなぜでしょうか. 必要性を考えずにここまで進めてしまい,申し訳ないのですが,お答えいただけたら幸いです.
普通はあまりしないのかもしれないです. ここについては秋田の知識不足もあるのでなんとも言えないのですが, 説明変数のスケールから目的変数のスケールにあげる際(学習によって推論する際)に極端にパラメータが大きくなることで, ズレが顕著に現れるのを防ぐことができると考えたからです.
correct
ラベルが直線になっているのは違和感がありますね.
修正し,コミットいたしましたので,再度ご確認いただけたら幸いです.
説明変数のスケールから目的変数のスケールにあげる際(学習によって推論する際)に極端にパラメータが大きくなることで, ズレが顕著に現れるのを防ぐことができる
ご回答ありがとうございます.
現状,元のスケールに引き戻す作業を「真の値」と「予測値」のそれぞれに行っているのですが,それでは正規化の意味がないような気がしてしまいます. そうではなく,「真の値と予測値との差」に関して引き戻すということでしょうか.
よろしくお願いいたします.
そうではなく,「真の値と予測値との差」に関して引き戻すということでしょうか.
あまりそこに意味はないと思います.
現状,元のスケールに引き戻す作業を「真の値」と「予測値」のそれぞれに行っているのですが,それでは正規化の意味がないような気がしてしまいます.
そもそも, 説明変数に標準化をかけるのは, 特徴量ごとの平均を0, 分散を1に揃えることにあります. それにより, 予測の方向性を定めることができます. 説明変数のスケールが平均0, 分散1であるのに対し, 目的変数のスケールが平均5000弱, 分散100(?)などでは, 出力層の重みのパラメータが5000などとなり, 非常に誤差が現れやすくなります. 一度目的変数(真の値)を標準化してルールをつけることにより, 説明変数と似たスケール感で予測した結果に対して引き戻してあげることで予測の誤差を小さくしようという試みでした. ニューラルネットワークの細かい仕様がわからないので, 重回帰分析のように標準化の必要が無いかもしれないし, 標準化することによって精度を確実に上げられるかもしれないという実験的な検証をすることに意味があると思います.
なるほど,ちょうど「標準化の必要があるかどうか」を検証する試みだったのですね. 流れを掴みきれていませんでした.
ありがとうございます.
明日のミーティングについて、Googleカレンダーに招待を送らせていただきました.ご確認の程よろしくお願いいたします.
目的
タスクの指示など以外で連絡することがあればここに書く.
など.
重要度
連絡の重要度の Tier をタイトルに入れる. Tier は次を参照.
返信について
仕様上ツリーのようには出来ないので, どの話題についての返信なのかがわかるようにタイトルを付ける.
ex.) 「# RE. 3月23日の Zoom について」