Странное поведение линейной регрессии в PyTorch

Если вы потратите некоторое время на просмотр javascript, вы заметите, что у всех асинхронных функций есть механизм, позволяющий вам знать, когда они будут выполнены. Обычно это обратные вызовы или обещания, но иногда такие вещи, как события.

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

Попросить foo вызвать обратный вызов

Вы можете изменить foo(), чтобы вызвать обратный вызов, когда он будет завершен. Тогда это может выглядеть так:

 function foo(cb){
    setTimeout(()=>{
        console.log("hello world")
        cb(null, true) // callbacks offen pass an error as their first arg or null if there's no error

    },1000)
}

При этом bar() может называть его передачей обратного вызова, а затем либо запускать обратный вызов, либо возвращать обещание. Здесь мы вернем обещание и соединим все это:

function foo(cb){
    console.log("foo called")
    setTimeout(()=>{
        console.log("foo's timeout finished")
        cb(null, true)

    },1000)
}
    
function bar(){
    console.log("car called")
    return new Promise((resolve, reject) =>{
        foo((err, res) => {
            if (err) return reject(err)
            resolve( "foo finished with " + res)
        })
    })
}

bar().then((result)=>console.log("bar has finish and returned: ", result))

Или у Foo есть обещание

Если foo() просто вернул обещание, которое было разрешено, когда оно было закончено, все будет проще, потому что тогда bar() может просто вернуться, а затем пообещать или вызвать .then() и вернуть это, если ему нужно обработать результаты:

function foo(cb) {
  return new Promise(resolve => setTimeout(() => {
    console.log("hello world")
    resolve(true)
  }, 1000))
}

function bar() {
  return foo().then(res => "foo finished with: " + res)
}

bar().then((result) => console.log("bar has finish and returned: ", result))

1
задан dennlinger 21 January 2019 в 17:16
поделиться

1 ответ

Это связано с тем, что вы сами берете обучающие образцы из случайного распределения .

Тем самым вы в некоторой степени рандомизировали основную истину. Конечно, вы получите значения, которые по своей природе распределены вокруг 2x+5, но вы не гарантируете, что 2x+5 также будет наилучшим образом соответствовать этому распределению данных.
Таким образом, может случиться так, что вы случайно получите значения, которые значительно отличаются от исходной функции, и, поскольку вы используете среднеквадратичную ошибку в квадрате , эти значения будут взвешены довольно значительно.

В ожидании (т. Е. Для количества выборок, идущих к бесконечности), вы, вероятно, станете ближе и ближе к ожидаемым параметрам.

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

0
ответ дан dennlinger 21 January 2019 в 17:16
поделиться
Другие вопросы по тегам:

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