Как я рассказываю про attention на собесах
#ml #interview
“66% кандидатов в Амазон проваливают этот вопрос” – такой могла бы быть обложка очередного видео фултайм ютубера-за-еду. Можно смеяться. Но судя по инсайдам по крайней мере от одного знакомого из Амазона (типично для бигтеха с опытом 200+ собесов с нанимающей стороны) – две трети кандидатов на позицию Senior Applied Scientist не могут внятно расписать механизм attention и зачем там в трансформере нужны keys, queries и values.
Думаю, это не самый простой вопрос, тут лично у меня раз в год открывается какой-то следующий уровень понимания. И также меня легко завалить, если глубже копнуть в attention – а-ля “все ли вектора k, q, v должны быть одной размерности?”, “можно ли сделать attention на двух проекциях, а не трех? почему не взять только Q и V” и т.д. Но конструктива ради давайте поделюсь, как я отвечал на базовый вопрос "How does the attention mechanism work?". Его, к слову, задавали не раз и не два, а как минимум 5 раз за мои 50 собесов с 18-ю компаниями (стату по собесам тоже опубликую, уже после раскрытия карт, куда пошел #todo🧐 ). Может, survivorship bias, но скорее мой вариант ответа работает, а именно, не только верен, но и помогает выделиться на фоне других кандидатов.
Общий принцип: не формулу зазубривать, а продемонстрировать понимание. Например, через аналогии. В случае классического attention, который еще в RNN появился (сюрприз для тех, кто думает, что до трансформеров никакого attention не было) – я рассказываю про аналогию с переводом, как это описывал изобретатель механизма внимания, “наш” парень Дима Богданов (пост). Когда доходит до k, q, v, я провожу аналогию со словарем, в два этапа (тут бы, конечно, нужен блог пост с картинками, как у Аламмара, но отвечать на собесе вы будете махая руками и говоря словами изо рта, так что и тут далее голый текст).
Итак, основная аналогия: нечеткий словарь. Рассмотрим стандартный hash map, например, питоновский словарь: {’Ann’: 167, ‘Bob’: 182, ‘Zoe’: 192} – имена и рост. Мы из словаря либо достаем значение либо нет, в зависимости от того, совпал ли запрос (Query) с ключом (Key). То есть по запросу “Ann” мы достаем значение (Value) 167, но по запросу “Carl” ничего не достанем. А что делать с запросом “Anna”? Стандартный словарь так же точно ничего не даст, поскольку такого ключа нет. Но понятно, что “Anna” - это почти “Ann”. Что если вытащить некоторый “средний рост” – усредненное значение (value), взвешенное по похожести запроса (query) на ключи (key). Условно с весом 0.96 мы возьмем рост Ann и всего с весом 0.02 значения роста Bob и Zoe. Пример совсем искусственный, но уже позволяет понять и запомнить, почему мы сравниваем похожесть именно запроса (Q) c ключами (K), а только потом эти коэф-ты похожести в качестве весов умножаем на значения (V).
Усложняем аналогию, делаем ее чуть менее искусственной и показываем, как тут еще и kNN появляется. Теперь и запросы, и ключи – вектора, какие-то признаки компаний, например, выручка в том году, число сотрудников и т.д. А значение пусть все еще будет вещественным – выручка в этом году. Тогда словарь будет выглядеть как-то так: {[17, 20000, … <признаки компании 1>]: 400, [11, 10000, … <признаки компании 2>]: 100}. Если приходит запрос – новая компания с каким-то вектором признаков [13, 15000, … <признаки компании 3>], можно примерно оценить ее выручку, сравнив вектор запроса с векторами ключей (вот уже QK^T наклевывается) и так же точно взвесив значения в словаре с весами, пропорциональными похожести компании-запроса на компании-ключи. Аккурат то что делает kNN в задаче регрессии.
И наконец когда значения values уже тоже вектора, а не просто числа – можно упомянуть эмбеддинги токенов и как они обновляются по похожести на эмбеддинги соседних токенов. И совсем в конце можно и формулу dot-product attention описать, чтоб показать, что в математику тоже умеем.
Мне подобные аналогии показались полезными, даже если они приблизительны. Так и запоминается лучше, и легко выделиться на фоне очередного кандидата, пытающегося по постам Аламмара вспомнить формулу.
#ml #interview
“66% кандидатов в Амазон проваливают этот вопрос” – такой могла бы быть обложка очередного видео фултайм ютубера-за-еду. Можно смеяться. Но судя по инсайдам по крайней мере от одного знакомого из Амазона (типично для бигтеха с опытом 200+ собесов с нанимающей стороны) – две трети кандидатов на позицию Senior Applied Scientist не могут внятно расписать механизм attention и зачем там в трансформере нужны keys, queries и values.
Думаю, это не самый простой вопрос, тут лично у меня раз в год открывается какой-то следующий уровень понимания. И также меня легко завалить, если глубже копнуть в attention – а-ля “все ли вектора k, q, v должны быть одной размерности?”, “можно ли сделать attention на двух проекциях, а не трех? почему не взять только Q и V” и т.д. Но конструктива ради давайте поделюсь, как я отвечал на базовый вопрос "How does the attention mechanism work?". Его, к слову, задавали не раз и не два, а как минимум 5 раз за мои 50 собесов с 18-ю компаниями (стату по собесам тоже опубликую, уже после раскрытия карт, куда пошел #todo
Общий принцип: не формулу зазубривать, а продемонстрировать понимание. Например, через аналогии. В случае классического attention, который еще в RNN появился (сюрприз для тех, кто думает, что до трансформеров никакого attention не было) – я рассказываю про аналогию с переводом, как это описывал изобретатель механизма внимания, “наш” парень Дима Богданов (пост). Когда доходит до k, q, v, я провожу аналогию со словарем, в два этапа (тут бы, конечно, нужен блог пост с картинками, как у Аламмара, но отвечать на собесе вы будете махая руками и говоря словами изо рта, так что и тут далее голый текст).
Итак, основная аналогия: нечеткий словарь. Рассмотрим стандартный hash map, например, питоновский словарь: {’Ann’: 167, ‘Bob’: 182, ‘Zoe’: 192} – имена и рост. Мы из словаря либо достаем значение либо нет, в зависимости от того, совпал ли запрос (Query) с ключом (Key). То есть по запросу “Ann” мы достаем значение (Value) 167, но по запросу “Carl” ничего не достанем. А что делать с запросом “Anna”? Стандартный словарь так же точно ничего не даст, поскольку такого ключа нет. Но понятно, что “Anna” - это почти “Ann”. Что если вытащить некоторый “средний рост” – усредненное значение (value), взвешенное по похожести запроса (query) на ключи (key). Условно с весом 0.96 мы возьмем рост Ann и всего с весом 0.02 значения роста Bob и Zoe. Пример совсем искусственный, но уже позволяет понять и запомнить, почему мы сравниваем похожесть именно запроса (Q) c ключами (K), а только потом эти коэф-ты похожести в качестве весов умножаем на значения (V).
Усложняем аналогию, делаем ее чуть менее искусственной и показываем, как тут еще и kNN появляется. Теперь и запросы, и ключи – вектора, какие-то признаки компаний, например, выручка в том году, число сотрудников и т.д. А значение пусть все еще будет вещественным – выручка в этом году. Тогда словарь будет выглядеть как-то так: {[17, 20000, … <признаки компании 1>]: 400, [11, 10000, … <признаки компании 2>]: 100}. Если приходит запрос – новая компания с каким-то вектором признаков [13, 15000, … <признаки компании 3>], можно примерно оценить ее выручку, сравнив вектор запроса с векторами ключей (вот уже QK^T наклевывается) и так же точно взвесив значения в словаре с весами, пропорциональными похожести компании-запроса на компании-ключи. Аккурат то что делает kNN в задаче регрессии.
И наконец когда значения values уже тоже вектора, а не просто числа – можно упомянуть эмбеддинги токенов и как они обновляются по похожести на эмбеддинги соседних токенов. И совсем в конце можно и формулу dot-product attention описать, чтоб показать, что в математику тоже умеем.
Мне подобные аналогии показались полезными, даже если они приблизительны. Так и запоминается лучше, и легко выделиться на фоне очередного кандидата, пытающегося по постам Аламмара вспомнить формулу.