Pytorch 및? 변압기.
PYPI에서 라이브러리 설치 :
pip install transformers-embedder또는 콘다에서 :
conda install -c riccorl transformers-embedderPytorch 레이어와 Huggingface? Transformers Library에서 거의 모든 사전에 사전 된 모델을 지원하는 토 케이저를 제공합니다. 다음은 빠른 예입니다.
import transformers_embedder as tre
tokenizer = tre . Tokenizer ( "bert-base-cased" )
model = tre . TransformersEmbedder (
"bert-base-cased" , subword_pooling_strategy = "sparse" , layer_pooling_strategy = "mean"
)
example = "This is a sample sentence"
inputs = tokenizer ( example , return_tensors = True ) {
'input_ids': tensor([[ 101, 1188, 1110, 170, 6876, 5650, 102]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1]]),
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0]])
'scatter_offsets': tensor([[0, 1, 2, 3, 4, 5, 6]]),
'sparse_offsets': {
'sparse_indices': tensor(
[
[0, 0, 0, 0, 0, 0, 0],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6]
]
),
'sparse_values': tensor([1., 1., 1., 1., 1., 1., 1.]),
'sparse_size': torch.Size([1, 7, 7])
},
'sentence_length': 7 # with special tokens included
}
outputs = model ( ** inputs ) # outputs.word_embeddings.shape[1:-1] # remove [CLS] and [SEP]
torch.Size([1, 5, 768])
# len(example)
5
변압기 기반 모델을 사용하는 성가심 중 하나는 출력 하위 토로 임베딩에서 단어 임베딩을 계산하는 것이 사소한 것이 아니라는 것입니다. 이 API를 사용하면 트랜스포머를 사용하는 것만 큼 쉽습니다.
TransformersEmbedder 클래스는 임베딩을 얻는 3 가지 방법을 제공합니다.
subword_pooling_strategy="sparse" : 스파스 매트릭스 곱셈을 사용하여 각 단어의 하위 토크의 임베딩 평균을 계산합니다. 이 전략은 기본 전략입니다.subword_pooling_strategy="scatter" : 산란 수집 작전을 사용하여 각 단어의 하위 토크의 임베딩 평균을 계산합니다. 결정 론적이지는 않지만 ONNX 내보내기와 함께 작동합니다.subword_pooling_strategy="none" : 하위 토로 풀링없이 변압기 모델의 원시 출력을 반환합니다.여기에 작은 피처 테이블이 있습니다.
| 풀링 | 결정 론적 | onx | |
|---|---|---|---|
| 부족한 | ✅ | ✅ | |
| 소수 | ✅ | ✅ | |
| 없음 | ✅ | ✅ |
layer_pooling_strategy 매개 변수를 사용하여 얻을 수있는 여러 유형의 출력이 있습니다.
layer_pooling_strategy="last" : 변압기 모델의 마지막 숨겨진 상태를 반환합니다.layer_pooling_strategy="concat" : 선택한 output_layers 의 연결을 반환합니다.layer_pooling_strategy="sum" : 변압기 모델의 선택한 output_layers 의 합을 반환합니다.layer_pooling_strategy="mean" : 변압기 모델의 선택한 output_layers 의 평균을 반환합니다.layer_pooling_strategy="scalar_mix" : 변압기 모델의 선택된 output_layers 의 매개 변수화 된 스칼라 혼합물 층의 출력을 반환합니다. Huggingface 모델의 모든 출력을 원한다면 return_all=True 설정하여 얻을 수 있습니다.
class TransformersEmbedder ( torch . nn . Module ):
def __init__ (
self ,
model : Union [ str , tr . PreTrainedModel ],
subword_pooling_strategy : str = "sparse" ,
layer_pooling_strategy : str = "last" ,
output_layers : Tuple [ int ] = ( - 4 , - 3 , - 2 , - 1 ),
fine_tune : bool = True ,
return_all : bool = True ,
) Tokenizer 클래스는 tokenize 메소드를 제공하여 TransformersEmbedder 층의 입력을 전처리합니다. 당신은 원시 문장, 사전 고정 된 문장 및 문장을 배치로 전달할 수 있습니다. 모델의 입력으로 사전을 반환하는 것이 전처리됩니다. return_tensors=True 전달하면 입력을 torch.Tensor 로 반환합니다.
기본적으로 문자열로 텍스트 (또는 배치)를 전달하는 경우 HuggingFace Tokenizer를 사용하여 토큰 화를합니다.
text = "This is a sample sentence"
tokenizer ( text )
text = [ "This is a sample sentence" , "This is another sample sentence" ]
tokenizer ( text ) is_split_into_words=True 설정하여 사전 고정 된 문장 (또는 문장 배치)을 전달할 수 있습니다.
text = [ "This" , "is" , "a" , "sample" , "sentence" ]
tokenizer ( text , is_split_into_words = True )
text = [
[ "This" , "is" , "a" , "sample" , "sentence" , "1" ],
[ "This" , "is" , "sample" , "sentence" , "2" ],
]
tokenizer ( text , is_split_into_words = True )먼저 토큰 화기를 초기화하십시오
import transformers_embedder as tre
tokenizer = tre . Tokenizer ( "bert-base-cased" ) text = "This is a sample sentence"
tokenizer ( text ) {
{
'input_ids': [[101, 1188, 1110, 170, 6876, 5650, 102]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1]],
'scatter_offsets': [[0, 1, 2, 3, 4, 5, 6]],
'sparse_offsets': {
'sparse_indices': tensor(
[
[0, 0, 0, 0, 0, 0, 0],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6]
]
),
'sparse_values': tensor([1., 1., 1., 1., 1., 1., 1.]),
'sparse_size': torch.Size([1, 7, 7])
},
'sentence_lengths': [7],
}
text = "This is a sample sentence A"
text_pair = "This is a sample sentence B"
tokenizer ( text , text_pair ) {
'input_ids': [[101, 1188, 1110, 170, 6876, 5650, 138, 102, 1188, 1110, 170, 6876, 5650, 139, 102]],
'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]],
'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],
'scatter_offsets': [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]],
'sparse_offsets': {
'sparse_indices': tensor(
[
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
]
),
'sparse_values': tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
'sparse_size': torch.Size([1, 15, 15])
},
'sentence_lengths': [15],
}
padding=True 및 return_tensors=True , Tokenizer는 모델에 준비된 텍스트를 반환합니다. batch = [
[ "This" , "is" , "a" , "sample" , "sentence" , "1" ],
[ "This" , "is" , "sample" , "sentence" , "2" ],
[ "This" , "is" , "a" , "sample" , "sentence" , "3" ],
# ...
[ "This" , "is" , "a" , "sample" , "sentence" , "n" , "for" , "batch" ],
]
tokenizer ( batch , padding = True , return_tensors = True )
batch_pair = [
[ "This" , "is" , "a" , "sample" , "sentence" , "pair" , "1" ],
[ "This" , "is" , "sample" , "sentence" , "pair" , "2" ],
[ "This" , "is" , "a" , "sample" , "sentence" , "pair" , "3" ],
# ...
[ "This" , "is" , "a" , "sample" , "sentence" , "pair" , "n" , "for" , "batch" ],
]
tokenizer ( batch , batch_pair , padding = True , return_tensors = True ) 모델 입력에 사용자 정의 필드를 추가하고 tokenizer 에게 add_padding_ops 사용하여 패드하는 방법을 알려줍니다. 모델 이름으로 토 케이저를 초기화하여 시작하십시오.
import transformers_embedder as tre
tokenizer = tre . Tokenizer ( "bert-base-cased" )그런 다음 사용자 정의 필드를 추가하십시오.
custom_fields = {
"custom_filed_1" : [
[ 0 , 0 , 0 , 0 , 1 , 0 , 0 ],
[ 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 ]
]
} 이제 사용자 정의 필드 custom_filed_1 에 대한 패딩 로직을 추가 할 수 있습니다. add_padding_ops 메소드는 입력을 취합니다
key : Tokenizer 입력의 필드 이름value : 패딩에 사용할 가치length : 길이까지. int 또는 두 개의 문자열 값, 하위 단어가 서브 워드의 길이와 일치하도록 subword 채워질 수 있으며, 하위 단어의 병합 후 배치 길이에 비해 요소가 패딩되는 word 될 수 있습니다. tokenizer . add_padding_ops ( "custom_filed_1" , 0 , "word" )마지막으로 사용자 정의 필드로 입력을 토큰화할 수 있습니다.
text = [
"This is a sample sentence" ,
"This is another example sentence just make it longer, with a comma too!"
]
tokenizer ( text , padding = True , return_tensors = True , additional_inputs = custom_fields )입력은 제출 된 사용자 정의를 포함하여 모델에 대한 준비가되어 있습니다.
>>> inputs
{
'input_ids': tensor(
[
[ 101, 1188, 1110, 170, 6876, 5650, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 101, 1188, 1110, 1330, 1859, 5650, 1198, 1294, 1122, 2039, 117, 1114, 170, 3254, 1918, 1315, 106, 102]
]
),
'token_type_ids': 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
),
'attention_mask': tensor(
[
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
),
'scatter_offsets': tensor(
[
[ 0, 1, 2, 3, 4, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16]
]
),
'sparse_offsets': {
'sparse_indices': tensor(
[
[ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16],
[ 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
]
),
'sparse_values': tensor(
[1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000,
1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000,
1.0000, 1.0000, 0.5000, 0.5000, 1.0000, 1.0000, 1.0000]
),
'sparse_size': torch.Size([2, 17, 18])
}
'sentence_lengths': [7, 17],
}
TransformersEmbedder 클래스의 일부 코드는 Pytorch Scatter 라이브러리에서 가져옵니다. 사전 제한 모델과 토큰 화제의 핵심은? 변압기.