Что стоит знать в фреймворке (для определенности pytorch):
- как строится вычислительный граф (у тензоров есть backward-функция, за которую можно дернуть для бекпропа)
- как представлять данные (условно складываем картинки в тензора [bs, channels, height, width])
- как управлять оптимизатором (обход весов, lr scheduling, grad_clip..)
- как мерить скорость и утилизацию железа (tqdm, watch nvidia-smi, profiler..)
- как дебажить наны (forward_hook, backward_hook)
- как сериализовать модель (torch.save, jit.trace, jit.script)
- как вычисляется лосс (давайте опросом, что должно быть у сети для многоклассовой классификации в голове?)
Пояснения на всякий случай:
- в доку не подглядывать!
- FC=Linear (иначе не лезло)
- если не понимаете о чем речь => reply с вопросом
🤔
18.0%
FC,Softmax,NLLLoss🤔
23.6%
FC,LogSoftmax,NLLLoss🤔
51.7%
FC,Softmax,CrossEntropyLo🤔
6.7%
FC,LogSoftmax,CrossEntropвдогонку микровопрос про бекпроп.
У нас есть MLP (несколько Linear слоев с нелинейностями или без), можно ли инициализировать матрицу весов нулями?
🤔
30.8%
да🤔
69.2%
нетвторой микровопрос, можно ли инициализировать матрицу весов нулями в двух Linear слоях подряд?
🤔
18.9%
да по индукции🤔
81.1%
теперь точно нетПопробуем как в старые добрые на доске, но без доски.
Если x не нулевой и градиенты на выход придут ненулевые, то W изменится на первой итерации и дальше все будет хорошо.
Могут ли градиенты быть не нулевыми? Зависит от дальнейшего графа :) еще один сломанный FC не даст учиться
Названия и обрывки математики из лекций приводят к путанице.
Мы вроде бы помним формулу, но что подавать на вход конкретной функции? В pytorch дела обстоят так:
- NLL ожидает на вход логарифмы вероятностей (logsoftmax)
- CE ожидает на вход сырые логиты (без sm и lsm)
LogSoftmax можно применять повторно, ничего не сломается)
Так что правильный вариант (FC, LSM, NLL) и окнорм (FC, LSM, CE).
Бтв, гадать как правильно не надо! Разберитесь с математикой и документацией по слою :)
попробуйте что будет если сделать неправильно