質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

Pytorchでの.gradが常に0になる理由

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 153

Yamafumi000

score 2

前提

Pytorchを用いたマルウェア検知のためのDeep Learningのモデルを作成しています.
その際にバイト列をそのままでは扱えないため,nn.Embeddingを用いて8次元にembeddingしています.
そしてそのembeddingしたバイト列をモデルに突っ込んで判定しているのですが,その際に.gradにアクセスすると存在はしているのですが,値が全て0になってしまいます.
これはどういうことなのでしょうか?

前処理
BINARY = b'MZ\x90\x00\x03\x00\x00\x00\x04\x00'
tensor_bytes = torch.from_numpy(np.frombuffer(BINARY,dtype=np.uint8)[np.newaxis,:]).float()
>>tensor([[ 77.,  90., 144.,  ...,  51.,   5.,  13.]])

embd_func = nn.Embedding(257, 8, padding_idx=0)
embd_bytes = embd_func(tensor_bytes) #torch.Size([1, 1054208, 8])
>>tensor([[[ 0.7340,  1.1138,  0.8525,  ..., -1.7343, -0.1635,  0.5149], 
         [-0.1660,  1.3984, -0.5087,  ..., -0.8441, -0.0746, -0.3979],
         ...
         [ 0.7354,  0.7951, -2.0175,  ..., -1.3213, -0.3241,  0.2827],
         [-1.5834,  0.4888,  0.3841,  ...,  1.2205,  1.2348,  2.0523]]])
gradientの取得を行うコード
embd_bytez.requires_grad = True
#modelに通して結果を出力
out = model(embd_bytez)
>>tensor([[-0.7082,  1.3883]], grad_fn=<AddmmBackward>)

result = F.softmax(out, dim=1)
>>tensor([[0.1094, 0.8906]], grad_fn=<SoftmaxBackward>)

label = torch.from_numpy(np.array([0]))
loss = criterion(result, label)
>>tensor(1.1581, grad_fn=<NllLossBackward>)

loss.backward()
opt.step()

grad = embd_bytez.grad
>>tensor([[[0., 0., 0.,  ..., 0., 0., 0.],
           [0., 0., 0.,  ..., 0., 0., 0.],
           ...
           [0., 0., 0.,  ..., 0., 0., 0.],
           [0., 0., 0.,  ..., 0., 0., 0.]]]) #常に値が0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • can110

    2020/07/19 21:31

    .gradの値がすべてゼロとはどのような手段で確認されたでしょうか?
    たとえば「print( (grad.numpy() == 0).all())」の結果はTrueでしょうか?

    キャンセル

  • Yamafumi000

    2020/07/19 22:27

    確認してみたらFalseでした….
    grad.sign()の値が全く変化しないので全部0なのかな? と思っていたのですが,単純に値が小さいだけでただの早とちりでした.
    gradの要素があまりにも小さすぎるせいでgrad.signが0になっていただけのようです.
    ありがとうございました!

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る