Yapay zeka model dosyasının içinde ne var?

Ali Orhun Akkirman
2 min readApr 15, 2023

Bir önceki yazım olan “BERT kullanımı” içeriğinde Model kavramından bahsetmiştim. Örnek olarak da BERT modelleri olarak “base” ve “large” modelinden bahsetmiştim. Bu modellerin kolay bir şekilde kullanılabilmesi için internette de çoğunlukla PyTorch ile aşağıdaki gibi bulabilip kolaylıkla kullanabiliyorsunuz.

from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained("bert-base-uncased")

Bu kodu Python ile çalıştırmaya başladığınızda Megabayt’larca bir veri. Base yerine Large çalıştırdığınızda ise GB seviyesinde eğitilmiş bir modelin indirildiğini görüyorsunuz. Ayrıca her model için pytorch kullanımında bu model “pytorch_model.bin” isminde kaydedilmekte olduğu görülmekte.

Teknik olarak modelin içerisinde “çok boyutlu” vektörlerin (tensör) yer aldığından biraz bahsetmiştik. Fakat yine de bu dosya içeriğini merak edenler için vektörlerin gözükmesi için aşağıdaki gibi bir komut uygulayarak vektörleri görebilirsiniz.

from transformers import BertTokenizer, BertModel
import pprint

model = BertModel.from_pretrained("bert-base-uncased")

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(model.state_dict())

print(model.config)

Bu şekilde python dosyasını çalıştırdığımızda model içerisinde bulunan ağırlık (weights) ve sapma (biases) değerlerini Python içerisinde sözlük veri tipinde görebilirsiniz. Tabi ki bu modeller içerisinde bir çok parametre ve veri olduğu için gözle takip etmek pek de kolay olmayacaktır.

[-0.0314, -0.0270, -0.0066, …, -0.0246, 0.0462, 0.0143],
…,
[ 0.0192, 0.0060, -0.0528, …, -0.0122, 0.0043, -0.0423],
[ 0.0778, -0.0088, -0.0427, …, -0.0479, 0.0217, 0.0111],
[ 0.0199, -0.0456, 0.0056, …, 0.0103, -0.0140, -0.0008]])),
( ‘decoder.block.10.layer.0.SelfAttention.k.weight’,
tensor([[-0.0209, 0.1906, -0.0277, …, 0.1339, 0.1294, -0.2665],
[-0.2993, 0.3022, 0.3191, …, 0.2865, -0.0651, 0.1307],
[-0.0037, 0.1742, 0.1626, …, 0.1345, 0.1181, 0.0338],
…,
[-0.2143, 0.0418, -0.3677, …, -0.3732, -0.2204, -0.3213],
[ 0.2440, -0.5068, -0.1174, …, -0.3131, 0.1484, -0.2173],
[ 0.1842, -0.5346, 0.0293, …, -0.4660, 0.0508, -0.0951]])),
( ‘decoder.block.10.layer.0.SelfAttention.v.weight’,
tensor([[ 8.8534e-02, -1.5656e-01, 7.7953e-01, …, 3.0843e-01,
-9.7306e-03, 3.7120e-01],

Ayrıca model kütüphanesi içerisindeki config() fonksiyonu ile model hakkında aşağıdaki gibi özet bilgi öğrenilebiliyor.

BertConfig {
“_name_or_path”: “bert-base-uncased”,
“architectures”: [
“BertForMaskedLM”
],
“attention_probs_dropout_prob”: 0.1,
“classifier_dropout”: null,
“gradient_checkpointing”: false,
“hidden_act”: “gelu”,
“hidden_dropout_prob”: 0.1,
“hidden_size”: 768,
“initializer_range”: 0.02,
“intermediate_size”: 3072,
“layer_norm_eps”: 1e-12,
“max_position_embeddings”: 512,
“model_type”: “bert”,
“num_attention_heads”: 12,
“num_hidden_layers”: 12,
“pad_token_id”: 0,
“position_embedding_type”: “absolute”,
“transformers_version”: “4.28.1”,
“type_vocab_size”: 2,
“use_cache”: true,
“vocab_size”: 30522
}

Burada model’in 30522 kelimeden oluştuğunu görebiliyoruz. Fakat model’in içerisinde kelime listesi bulunmuyor, daha doğrusu bunun için tokenizer objesini kullanmamız gerekiyor. Aşağıdaki şekilde model içerisindeki kelimeler ve dolayısıyla token’lere erişebilirsiniz:

from transformers import BertModel, BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')

Bu adımla birlikte “vocab.txt” isminde bir dosya indiriliyor ve bu dosyanın satır sayısına baktığımızda tam olarak 30522 olduğunu görüyoruz. Dolayısıyla model içerisindeki tensörlerin eşdeğer kelime listesi de burada bulunabilmektedir.

unbroken
adventurer
embroidery
inspecting
stanza
##ducted
naia
taluka
##pone
##roids
chases
deprivation
florian
##jing
##ppet
earthly

--

--

Ali Orhun Akkirman

Sistem Yönetim Yazılım Geliştirme Takım Lideri @HAVELSAN