Информация об изменениях

Сообщение Re: Слои от 16.05.2025 8:24

Изменено 16.05.2025 8:56 Nuzhny

Re: Слои
Здравствуйте, Нomunculus, Вы писали:

Н>1. как выбирают количество слоев? Видимо, наращивают по мере решения? То есть начинают с одного, задача не решается и добавляют другой? Но почему именно добавляют? Вдруг что-то не так именно со слоем, и не надо никакого нового слоя? Или слоев, например, 5. Как решают что нужен 6-ой, а не что-то не так с 5 уже существующими?


Практика: много запусков для тренировки различных вариантов, десятки лет, тысячи исследователей, NAS. Очень много экспериментов, очень, очень много.
Есть ещё несколько правил:
1. Если небольшая сеть хорошо обучилась на твоём датасете, то можно взять сеть больше и она будет работать лучше.
2. Если при этом большая сеть обучилась лучше, то можно её сделать разреженной (пруннинг) так, что она по качеству не просядет.
3. Если сеть становится слишком глубокой, то начинают затухать градиенты. Для этой проблемы придумали когда-то residual connection (Resnet).
4. Всякие batch normalization и ещё множество других трюков.

Н>2. Как выбирают функцию активации? Где-то ReLU, где-то нет. Почему так, а не иначе?


Также эксперименты. Что-то зависит от природы самих данных, что-то подбирают для улучшения производительности. Иногда ReLU или leaky ReLU часто может заменить что-то нелинейное почти без потери в качестве, но сильно быстрее по вычислениям.

Н>3. Как решают сколько входов-выходов у слоев? Ну, вход первого и выход последнего — это ясно. А например, у первого 256 входов, 128 выходов, у второго 128 входов, 32 выхода, у третьего 32 входа, 1024 выходов, у четвертого 1024 входов 8 выходов. С фига ли так? Откуда вообще эти числа?


В целом есть соображение, что чем глубже в нейросеть, тем выше уровень абстракции. Поэтому размер слоёв постепенно сокращается. Кратность к 32 удобна для вычислений, кажется больше ничего особенного в этом нет. Ставят свёртки друг за другом, смотрят соотношение производительность/качество и оставляют удачный вариант.

Н>Например, есть куча видосов автомобильного трафика. Надо определить скорость самой быстрой машины. Ну и пусть есть набор тренировочных данных. То есть для каждого видео и для каждого кадра есть число — скорость самой быстрой машины. Скажите ход мыслей как именно строить сеть? То есть вот такой первый шаг, не получилось — давайте добавим еще один — почему именно такой? Вот это интересно


Ну, это сразу будет обучение с учителем, задача регрессии. По одному кадру скорость не определить, поэтому явно надо делать двойной вход. Надо для каждого кадра одинаковое число свёрток, чтобы извлечь из пикселей признаки, с сырыми пикселями работать нет смысла. То есть пока две подсети работают параллельно. Потом я вспомню, что существует уже похожая архитектура — сиамские нейросети, попробую прикрутить их, изменив последний слой на выдачу скорости, а не меру похожести. Ну и буду смотреть на учится/не учится. Не учится — чаще всего соотношение размер_сети/размер_датасета слишком большое. Надо что-то делать. Совсем не учится никак, тогда буду думать и экспериментировать с подсетями, с итоговвым значением.
Re: Слои
Здравствуйте, Нomunculus, Вы писали:

Н>1. как выбирают количество слоев? Видимо, наращивают по мере решения? То есть начинают с одного, задача не решается и добавляют другой? Но почему именно добавляют? Вдруг что-то не так именно со слоем, и не надо никакого нового слоя? Или слоев, например, 5. Как решают что нужен 6-ой, а не что-то не так с 5 уже существующими?


Практика: много запусков для тренировки различных вариантов, десятки лет, тысячи исследователей, NAS. Очень много экспериментов, очень, очень много.
Есть ещё несколько правил:
1. Если небольшая сеть хорошо обучилась на твоём датасете, то можно взять сеть больше и она будет работать лучше.
2. Если при этом большая сеть обучилась лучше, то можно её сделать разреженной (пруннинг) так, что она по качеству не просядет.
3. Если сеть становится слишком глубокой, то начинают затухать градиенты. Для этой проблемы придумали когда-то residual connection (Resnet).
4. Всякие batch normalization и ещё множество других трюков.

Н>2. Как выбирают функцию активации? Где-то ReLU, где-то нет. Почему так, а не иначе?


Также эксперименты. Что-то зависит от природы самих данных, что-то подбирают для улучшения производительности. Иногда ReLU или leaky ReLU часто может заменить что-то нелинейное почти без потери в качестве, но сильно быстрее по вычислениям.

Н>3. Как решают сколько входов-выходов у слоев? Ну, вход первого и выход последнего — это ясно. А например, у первого 256 входов, 128 выходов, у второго 128 входов, 32 выхода, у третьего 32 входа, 1024 выходов, у четвертого 1024 входов 8 выходов. С фига ли так? Откуда вообще эти числа?


В целом есть соображение, что чем глубже в нейросеть, тем выше уровень абстракции. Поэтому размер слоёв постепенно сокращается. Кратность к 32 удобна для вычислений, кажется больше ничего особенного в этом нет. Ставят свёртки друг за другом, смотрят соотношение производительность/качество и оставляют удачный вариант.

Н>Например, есть куча видосов автомобильного трафика. Надо определить скорость самой быстрой машины. Ну и пусть есть набор тренировочных данных. То есть для каждого видео и для каждого кадра есть число — скорость самой быстрой машины. Скажите ход мыслей как именно строить сеть? То есть вот такой первый шаг, не получилось — давайте добавим еще один — почему именно такой? Вот это интересно


Ну, это сразу будет обучение с учителем, задача регрессии. По одному кадру скорость не определить, поэтому явно надо делать двойной вход. Надо для каждого кадра одинаковое число свёрток, чтобы извлечь из пикселей признаки, с сырыми пикселями работать нет смысла. То есть пока две подсети работают параллельно. Потом я вспомню, что существует уже похожая архитектура — сиамские нейросети, попробую прикрутить их, изменив последний слой на выдачу скорости, а не меру похожести. Ну и буду смотреть на учится/не учится. Не учится — чаще всего соотношение размер_сети/размер_датасета слишком большое. Надо что-то делать. Совсем не учится никак, тогда буду думать и экспериментировать с подсетями, с итоговвым значением.
Добавка. Вспомнил, что есть ещё сети, получающие на вход два кадра, например, для вычисления оптического потока. Так что я начал бы с них, скорее всего. Почему? Потому что они прямо таки уже содержат в себе большую часть решения. Осталось научиться для каждого вектора определять скорость — вот здесь уже сложнее, потому что это сильно контекстная штука. Возможно, что хорошего качества не получить без дополнительной настройки типа предварительной калибровки камеры, исправления дисторсии и т.д.