Как Вы дразните Запечатанный класс?

Чтобы понять, как возможно 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.

61
задан Brett Veenstra 30 October 2009 в 17:17
поделиться

8 ответов

Мое общее правило ползунка состоит в том, который возражает, что я должен дразнить, должен иметь единый интерфейс также. Я думаю, что это правильно мудрый дизайном и делает тесты намного легче (и обычно, что Вы получаете, если Вы делаете TDD). Больше об этом может быть считан в Google Testing Blog последнее сообщение (См. точку 9).

кроме того, я работал главным образом в Java за прошлые 4 года, и я могу сказать, что могу считать с одной стороны количество раз, я создал (изолированный) класс финала. Другое правило здесь, у меня должно всегда быть серьезное основание изолировать класс, в противоположность изоляции его по умолчанию.

9
ответ дан abyx 24 November 2019 в 17:25
поделиться

Для.NET Вы могли использовать что-то как TypeMock, который использует профильный API и позволяет Вам сцепляться в вызовы с почти чем-либо.

19
ответ дан Haacked 24 November 2019 в 17:25
поделиться

Проблема с TypeMock состоит в том, что он извиняет плохой дизайн. Теперь, я знаю, что это часто чужой плохой дизайн, который это скрывает, но разрешает, чтобы это в Ваш процесс разработки могло привести очень легко к разрешению Ваших собственных плохих проектов.

я думаю, собираетесь ли Вы использовать платформу насмешки, необходимо использовать традиционный (как Moq) и создать слой изоляции вокруг unmockable вещи и дразнить слой изоляции вместо этого.

4
ответ дан Brad Wilson 24 November 2019 в 17:25
поделиться

Существует ли способ реализовать запечатанный класс от интерфейса... и дразнить интерфейс вместо этого?

Что-то во мне чувствует, что наличие запечатанных классов является неправильным во-первых, но это - просто я:)

0
ответ дан Jon Limjap 24 November 2019 в 17:25
поделиться

Я обычно выбираю путь создания интерфейса и класса адаптера / прокси для облегчения имитации запечатанного тип. Тем не менее, я также экспериментировал с пропуском создания интерфейса и созданием незапечатанного типа прокси с помощью виртуальных методов. Это хорошо сработало, когда прокси действительно является естественным базовым классом, который инкапсулирует и использует часть запечатанного класса.

При работе с кодом, который требовал такой адаптации, я устал выполнять одни и те же действия для создания интерфейса и типа прокси, поэтому Я реализовал библиотеку для автоматизации этой задачи.

Код несколько сложнее, чем образец, приведенный в статье, на которую вы ссылаетесь, поскольку он создает сборку (вместо исходного кода), позволяет выполнять генерацию кода для любого типа ,

1
ответ дан 24 November 2019 в 17:25
поделиться

Я почти всегда избегаю зависимости от внешних классов глубоко внутри моего кода. Вместо этого я бы предпочел использовать адаптер / мост, чтобы поговорить с ними. Таким образом, я имею дело со своей семантикой, и боль от перевода изолирована в одном классе.

Это также упрощает переключение моих зависимостей в долгосрочной перспективе.

4
ответ дан 24 November 2019 в 17:25
поделиться

Вполне разумно издеваться над закрытым классом, потому что многие классы каркаса запечатаны.

В моем случае я пытаюсь имитировать класс 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;
    }
1
ответ дан 24 November 2019 в 17:25
поделиться

Я считаю, что Moles из Microsoft Research позволяет это сделать. Со страницы Moles:

Moles можно использовать для обхода любого метода .NET , включая невиртуальные / статические методы в запечатанных типах.

ОБНОВЛЕНИЕ: в предстоящем выпуске VS 11 есть новый фреймворк под названием «Fakes», предназначенный для замены Moles:

Fakes Framework в Visual Studio 11 - это следующее поколение Moles & Stubs, и со временем заменим его. Однако подделки отличаются от кротов, поэтому переход от кротов к подделкам потребует некоторых изменений в вашем коде. Руководство по этой миграции будет доступно позже.

Требования : Visual Studio 11 Ultimate, .NET 4.5

13
ответ дан 24 November 2019 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: