Pull to refresh

Comments 5

Спасибо за статью и ссылку с интерактивной визуализаций свёртки - хорошо поможет начинающим разобраться с этим.

1) Было бы очень интересно узнать о скоростных свёртках на GPU. Мне известен алгоритм основанный на умножении матриц. Я его реализовал. Но сдаётся мне, в TensorFlow свёртка делается ещё быстрее. Как именно?

2) Поправки весов ядер зависят от количества ядер свёртки и их размера. Как корректируют скорость обучения конкретного слоя? Делят ли скорость, например, на размеры ядра/их количества при обучении ядер? Я такое пробовал, но результат не очень. Всякие алгоритмы типа Адам мне не сильно помогли.

  1. Про быстрые свёртки на GPU: да, твой метод с умножением матриц работает, но TensorFlow быстрее за счёт cuDNN. Там используются штуки типа FFT или алгоритма Винограда — они снижают количество операций и лучше задействуют GPU. Прям конкретный алгоритм зависит от размера данных и ядра, cuDNN сам выбирает оптимальный.

  2. Про скорость обучения: делить её на размер ядра или их количество — не лучшая идея, это редко помогает, как ты и заметил. Adam и похожие оптимизаторы сами подстраивают скорость, но если хочешь точнее для слоя — попробуй что-то вроде LARS, где скорость зависит от норм весов и градиентов. Или вручную настрой разные скорости для слоёв в TensorFlow, но это муторно.

Спасибо, но есть вопросы:

1) "или алгоритма Винограда" - он не позволяет менять шаг свёртки и жётско привязан к рассчитанным размерам ядер. А ещё есть обратная свёртка (которая на самом деле, помнится, не совсем обратная)

2) "типа FFT" - для свёртки с произвольными параметрами?
3) "Adam и похожие оптимизаторы сами подстраивают скорость," - проблема в том, что слой генератора в GAN обучается через дискриминатор, когда градиенты уже размыты. Результат - дискриминатор обучается гораздо быстрее и эффективнее.

Кстати, есть ещё интересный вопрос с GAN. Вот есть там два этапа: обучение генератора через дискриминатор и обучение дискриминатора на истинных и фальшивых (от генератора) изображениях. И вопрос такой: можно ли совместить обучение генератора и обучение дискриминатора на фальшивых изображениях? То есть, просим генератор сделать фальшивку. Подаём её на дискриминатор. Задаём ошибку с точки зрения генератора (чтобы обмануть дискриминатор). Делаем обратный проход по дискриминатору (без изменения его весов). Делаем обратный проход по генератору с запоминанием изменений его весов (чтобы потом обновить). Теперь задаём дискриминатору, что эта картинка (которая уже обучала генератор только что) была фальшивой. И делаем обратный проход с изменением весов дискриминатора. Можно ли так делать для оптимизации? У меня GAN обучается очень плохо, вот я и думаю, в чём тут дело. Может быть, такое перетягивание одеяла приводит к плохому обучению?

Sign up to leave a comment.

Articles