След като изследва площада за самовнимание, „ябълката“ е заинтригувана от друг аспект на 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 всяка дума е история, всяка връзка е разказ, а всяка позиция е уникална перспектива.
Чрез преплитане на технически подробности с непрекъснат разказ, тази глава има за цел да демистифицира концепцията за позиционни кодировки, правейки я едновременно завладяваща и ясна.