След като изследва площада за самовнимание, „ябълката“ е заинтригувана от друг аспект на Transformerland: изкуството на позиционирането. В света на езика мястото, където се намирате, често определя кой сте. И така, „ябълката“ се осмелява да разбере значението на своята позиция в големия разказ на изреченията.

Докато „ябълката“ се разхожда из Transformerland, стига до великолепна обсерватория, Positional Encoding Tower. Тук думите не само научават за себе си, но и къде се намират в необятния пейзаж на едно изречение. Не става дума само за това да си „ябълка“; това е да бъдеш „ябълката“, която е изядена, хвърлена или на която се възхищаваш.

Защо позицията има значение

В рамките на кулата „ябълката“ бързо осъзнава важността на позицията си. Той припомня изречения като „Apple пусна нов продукт“ и „Нов продукт на Apple е вкусен“. От една страна, „ябълката“ е технологичен гигант; от друга, вкусен плод. Значението му често се променя в зависимост от това къде се намира.

За да го разбиете, помислете за фразата „Тя му каза“. Разменете позициите и получавате „Той й каза“. Думите остават същите, но целият разказ се променя. Позицията е възлова.

Различни методи за позиционно кодиране

Любопитно как работи тази магия за позициониране, „ябълката“ изследва различни стаи в кулата, всяка от които е посветена на уникален метод за позиционно кодиране.

1. Стая за синусоидално кодиране: В тази стая „ябълката“ намира поредица от осцилиращи вълни на екраните. Тези вълни, синуси и косинуси представляват позиции. Красотата на тези вълни е способността им да улавят позиции в дълги изречения без необходимост от огромни количества данни. Това е като да имате уникален ритмичен ритъм за всяка позиция в изречение.

 def sinusoidal_positional_encoding(position, dimension):
   angle_rates = 1 / np.power(10000, (2 * (dimension // 2)) / np.float32(dimension))
   angle_radians = position * angle_rates
   # Apply sine to even indices, cosine to odd indices
   encodings = np.zeros(angle_radians.shape)
   encodings[:, 0::2] = np.sin(angle_radians[:, 0::2])
   encodings[:, 1::2] = np.cos(angle_radians[:, 1::2])
   return encodings

Този кодов фрагмент показва как се използват синусоидални вълни за генериране на позиционни кодировки. Различните позиции в изречението получават различни вълнови модели, което гарантира, че позицията на всяка дума е уникално представена.

2. Стая за научено позиционно кодиране: Тук „ябълката“ намира друг метод. Вместо фиксирани модели като синуси и косинуси, позициите се научават с течение на времето, като се адаптират към данните. Това е подобно на изучаване на забележителности в нов град.

 class LearnedPositionalEncoding(nn.Module):
   def __init__(self, embedding_dim, max_position=512):
     super().__init__()
     self.positional_embeddings = nn.Embedding(max_position, embedding_dim)
   
   def forward(self, sequence_length):
     positions = torch.arange(sequence_length).unsqueeze(0)
     return self.positional_embeddings(positions)

В този код моделът научава най-доброто представяне за всяка позиция, докато се обучава на повече данни. Слоят `nn.Embedding` улавя същността на всяка позиция, като я прецизира с течение на времето.

Тъй като „ябълката“ се отдалечава от позиционната кодираща кула, тя не само познава нейната същност и връзки, но и уникалното си място в големия гоблен от изречения. Той осъзнава, че в Transformerland всяка дума е история, всяка връзка е разказ, а всяка позиция е уникална перспектива.

Чрез преплитане на технически подробности с непрекъснат разказ, тази глава има за цел да демистифицира концепцията за позиционни кодировки, правейки я едновременно завладяваща и ясна.