Исследовав площадь самовнимания, «яблоко» заинтриговано другим аспектом Трансформерленда: искусством позиционирования. В мире языка то, где вы находитесь, часто определяет, кто вы. Итак, «яблоко» решается понять значение своего положения в общем повествовании предложений.
Прогуливаясь по Трансформерленду, «яблоко» достигает великолепной обсерватории — Башни позиционного кодирования. Здесь слова познают не только себя, но и свое место в огромном ландшафте предложения. Речь идет не только о том, чтобы быть «яблоком»; речь идет о «яблоке», которое съели, бросили или которым восхищались.
Почему позиция важна
Внутри башни «Яблоко» быстро осознает важность своего положения. Он напоминает такие предложения, как «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 отражает суть каждой позиции, уточняя ее с течением времени.
Когда «яблоко» покидает Башню позиционного кодирования, оно не только осознает свою сущность и взаимоотношения, но и свое уникальное место в великом гобелене предложений. Он понимает, что в Трансформерленде каждое слово — это история, каждые отношения — это повествование, а каждая позиция — это уникальная точка зрения.
Переплетая технические детали с непрерывным повествованием, эта глава призвана прояснить концепцию позиционных кодировок, сделав ее одновременно увлекательной и понятной.