Исследовав площадь самовнимания, «яблоко» заинтриговано другим аспектом Трансформерленда: искусством позиционирования. В мире языка то, где вы находитесь, часто определяет, кто вы. Итак, «яблоко» решается понять значение своего положения в общем повествовании предложений.

Прогуливаясь по Трансформерленду, «яблоко» достигает великолепной обсерватории — Башни позиционного кодирования. Здесь слова познают не только себя, но и свое место в огромном ландшафте предложения. Речь идет не только о том, чтобы быть «яблоком»; речь идет о «яблоке», которое съели, бросили или которым восхищались.

Почему позиция важна

Внутри башни «Яблоко» быстро осознает важность своего положения. Он напоминает такие предложения, как «Apple выпустила новый продукт» и «Новый продукт 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 отражает суть каждой позиции, уточняя ее с течением времени.

Когда «яблоко» покидает Башню позиционного кодирования, оно не только осознает свою сущность и взаимоотношения, но и свое уникальное место в великом гобелене предложений. Он понимает, что в Трансформерленде каждое слово — это история, каждые отношения — это повествование, а каждая позиция — это уникальная точка зрения.

Переплетая технические детали с непрерывным повествованием, эта глава призвана прояснить концепцию позиционных кодировок, сделав ее одновременно увлекательной и понятной.