web-dev-qa-db-ja.com

Huggingface Bert Modelの上に高密度層を追加します

生の隠れた状態を出力するベアバートモデルトランスの上に密なレイヤーを追加し、結果として得られるモデルを微調整したいです。具体的には、 この ベースモデルを使用しています。これがモデルがするものです。

  1. 文章(文の各トークンに768の要素を持つベクトル)をエンコードします。
  2. 最初のベクトルだけを保持します(最初のトークンに関連しています)
  3. 希望の変換を得るために、このベクトルの上に密な層を追加します

これまでのところ、私は文章を首尾よく符号化しました:

from sklearn.neural_network import MLPRegressor

import torch

from transformers import AutoModel, AutoTokenizer

# List of strings
sentences = [...]
# List of numbers
labels = [...]

tokenizer = AutoTokenizer.from_pretrained("dbmdz/bert-base-italian-xxl-cased")
model = AutoModel.from_pretrained("dbmdz/bert-base-italian-xxl-cased")

# 2D array, one line per sentence containing the embedding of the first token
encoded_sentences = torch.stack([model(**tokenizer(s, return_tensors='pt'))[0][0][0]
                                 for s in sentences]).detach().numpy()

regr = MLPRegressor()
regr.fit(encoded_sentences, labels)
 _

このようにして、私はそれをエンコードされた文で給餌することによってニューラルネットワークを訓練することができます。しかし、このアプローチは明らかにベースBERTモデルを調整しません。誰かが私を助けますか?どのようにして(おそらくPytorchで、またはHuggingfaceライブラリを使用して)モデルを構築することができますか。

5
Riccardo Bucco

BERTモデル自体を調整したい場合は、モデルのパラメータを変更する必要があります。これを行うには、おそらくPytorchであなたの仕事をしたいと思うでしょう。これを説明するためのいくつかの大まかなPSUEDOコードがあります。

from torch.optim import SGD

model = ... # whatever model you are using
parameters = model.parameters() # or some more specific set of parameters
optimizer = SGD(parameters,lr=.01) # or whatever optimizer you want
optimizer.zero_grad() # boiler-platy pytorch function

input = ... # whatever the appropriate input for your task is
label = ... # whatever the appropriate label for your task is
loss = model(**input, label) # usuall loss is the first item returned
loss.backward() # calculates gradient
optim.step() # runs optimization algorithm
 _

私はあなたの特定のタスクが何であれであれ、非常に面倒で具体的であるため、私はすべての関連する詳細を省きました。 HuggingFaceにはこれを歩く素敵な記事があります ここでは 、あなたが任意のPytorchのものを使用するときにいくつかのPytorchの資料を参照したいと思うでしょう。私はそれを真剣にしようとする前に、 Pytorch Blitz を強くお勧めします。

1
Nathan Chappell