Чтобы понять, как возможно backpropagation даже с такими функциями, как ReLU, вам нужно понять, что является самым важным свойством производной, которое делает так, что алгоритм backpropagation работает так хорошо. Это свойство состоит в том, что:
f(x) ~ f(x0) + f'(x0)(x - x0)
Если вы рассматриваете x0
как фактическое значение вашего параметра на данный момент - вы можете сказать (знающее значение функции стоимости и его производного), как функция стоимости будет если вы немного измените свои параметры. Это самая важная вещь в backpropagation.
Из-за того, что функция вычислительной стоимости имеет решающее значение для вычисления стоимости - вам понадобится ваша функция стоимости, чтобы удовлетворить указанное выше свойство. Легко проверить, что ReLU удовлетворяет этому свойству всюду, кроме малой окрестности 0
. И это единственная проблема с ReLU - тот факт, что мы не можем использовать это свойство, когда мы близки к 0
.
Чтобы преодолеть это, вы можете выбрать значение производной ReLU в 0
либо 1
или 0
. С другой стороны, большинство исследователей не рассматривают эту проблему как серьезную, просто из-за того, что быть близким к 0
во время вычислений ReLU относительно редко.
Из вышеизложенного - конечно - с чистой математической точки зрения нецелесообразно использовать ReLU с алгоритмом обратного распространения. С другой стороны - на практике обычно не имеет никакого значения, что это странное поведение вокруг 0.
Мое общее правило ползунка состоит в том, который возражает, что я должен дразнить, должен иметь единый интерфейс также. Я думаю, что это правильно мудрый дизайном и делает тесты намного легче (и обычно, что Вы получаете, если Вы делаете TDD). Больше об этом может быть считан в Google Testing Blog последнее сообщение (См. точку 9).
кроме того, я работал главным образом в Java за прошлые 4 года, и я могу сказать, что могу считать с одной стороны количество раз, я создал (изолированный) класс финала. Другое правило здесь, у меня должно всегда быть серьезное основание изолировать класс, в противоположность изоляции его по умолчанию.
Для.NET Вы могли использовать что-то как TypeMock, который использует профильный API и позволяет Вам сцепляться в вызовы с почти чем-либо.
Проблема с TypeMock состоит в том, что он извиняет плохой дизайн. Теперь, я знаю, что это часто чужой плохой дизайн, который это скрывает, но разрешает, чтобы это в Ваш процесс разработки могло привести очень легко к разрешению Ваших собственных плохих проектов.
я думаю, собираетесь ли Вы использовать платформу насмешки, необходимо использовать традиционный (как Moq) и создать слой изоляции вокруг unmockable вещи и дразнить слой изоляции вместо этого.
Существует ли способ реализовать запечатанный класс от интерфейса... и дразнить интерфейс вместо этого?
Что-то во мне чувствует, что наличие запечатанных классов является неправильным во-первых, но это - просто я:)
Я обычно выбираю путь создания интерфейса и класса адаптера / прокси для облегчения имитации запечатанного тип. Тем не менее, я также экспериментировал с пропуском создания интерфейса и созданием незапечатанного типа прокси с помощью виртуальных методов. Это хорошо сработало, когда прокси действительно является естественным базовым классом, который инкапсулирует и использует часть запечатанного класса.
При работе с кодом, который требовал такой адаптации, я устал выполнять одни и те же действия для создания интерфейса и типа прокси, поэтому Я реализовал библиотеку для автоматизации этой задачи.
Код несколько сложнее, чем образец, приведенный в статье, на которую вы ссылаетесь, поскольку он создает сборку (вместо исходного кода), позволяет выполнять генерацию кода для любого типа ,
Я почти всегда избегаю зависимости от внешних классов глубоко внутри моего кода. Вместо этого я бы предпочел использовать адаптер / мост, чтобы поговорить с ними. Таким образом, я имею дело со своей семантикой, и боль от перевода изолирована в одном классе.
Это также упрощает переключение моих зависимостей в долгосрочной перспективе.
Вполне разумно издеваться над закрытым классом, потому что многие классы каркаса запечатаны.
В моем случае я пытаюсь имитировать класс MessageQueue в .Net, чтобы я мог TDD свою изящную логику обработки исключений.
Если у кого-то есть идеи о том, как преодолеть ошибку Moq относительно «Недопустимая установка на непереопределяемом члене», пожалуйста, дайте мне знать.
код:
[TestMethod]
public void Test()
{
Queue<Message> messages = new Queue<Message>();
Action<Message> sendDelegate = msg => messages.Enqueue(msg);
Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate =
(v1, v2) =>
{
throw new Exception("Test Exception to simulate a failed queue read.");
};
MessageQueue mockQueue = QueueMonitorHelper.MockQueue(sendDelegate, receiveDelegate).Object;
}
public static Mock<MessageQueue> MockQueue
(Action<Message> sendDelegate, Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate)
{
Mock<MessageQueue> mockQueue = new Mock<MessageQueue>(MockBehavior.Strict);
Expression<Action<MessageQueue>> sendMock = (msmq) => msmq.Send(It.IsAny<Message>()); //message => messages.Enqueue(message);
mockQueue.Setup(sendMock).Callback<Message>(sendDelegate);
Expression<Func<MessageQueue, Message>> receiveMock = (msmq) => msmq.Receive(It.IsAny<TimeSpan>(), It.IsAny<MessageQueueTransaction>());
mockQueue.Setup(receiveMock).Returns<TimeSpan, MessageQueueTransaction>(receiveDelegate);
return mockQueue;
}
Я считаю, что Moles из Microsoft Research позволяет это сделать. Со страницы Moles:
Moles можно использовать для обхода любого метода .NET , включая невиртуальные / статические методы в запечатанных типах.
ОБНОВЛЕНИЕ: в предстоящем выпуске VS 11 есть новый фреймворк под названием «Fakes», предназначенный для замены Moles:
Fakes Framework в Visual Studio 11 - это следующее поколение Moles & Stubs, и со временем заменим его. Однако подделки отличаются от кротов, поэтому переход от кротов к подделкам потребует некоторых изменений в вашем коде. Руководство по этой миграции будет доступно позже.
Требования : Visual Studio 11 Ultimate, .NET 4.5