我试图使用梯度下降在N个参数中找到函数的最小值.但是我想这样做,同时将参数的绝对值之和限制为1(或<= 1,无关紧要).由于这个原因,我使用了拉格朗日乘数的方法,所以如果我的函数是f(x),我将最小化f(x)+ lambda*(g(x)-1)其中g(x)是平滑近似值参数绝对值的总和.
根据我的理解,当g(x)= 1时,此函数的梯度将仅为0,因此找到局部最小值的方法应该找到我的条件也满足的最小函数.问题是这个加法我的函数是无界的,因此Gradient Descent只是找到越来越大的lambdas,它们具有越来越大的参数(绝对值)并且永远不会收敛.
目前我正在使用CG的python(scipy)实现,所以我真的更喜欢不要求我自己重新编写/调整CG代码但使用现有方法的建议.
我上周开始学习机器学习.当我想制作一个梯度下降脚本来估计模型参数时,我遇到了一个问题:如何选择合适的学习率和方差.我发现,不同的(学习率,方差)对可能会导致不同的结果,有些你甚至无法收敛.此外,如果更改为另一个训练数据集,选择良好(学习率,方差)对可能不起作用.例如(下面的脚本),当我将学习率设置为0.001并且方差为0.00001时,对于'data1',我可以得到合适的theta0_guess和theta1_guess.但是对于'data2',它们无法使算法收敛,即使我尝试了几十个(学习率,方差)对仍然无法达到收敛.
所以,如果有人能告诉我,有一些标准或方法来确定(学习率,方差)对.
import sys
data1 = [(0.000000,95.364693) ,
(1.000000,97.217205) ,
(2.000000,75.195834),
(3.000000,60.105519) ,
(4.000000,49.342380),
(5.000000,37.400286),
(6.000000,51.057128),
(7.000000,25.500619),
(8.000000,5.259608),
(9.000000,0.639151),
(10.000000,-9.409936),
(11.000000, -4.383926),
(12.000000,-22.858197),
(13.000000,-37.758333),
(14.000000,-45.606221)]
data2 = [(2104.,400.),
(1600.,330.),
(2400.,369.),
(1416.,232.),
(3000.,540.)]
def create_hypothesis(theta1, theta0):
return lambda x: theta1*x + theta0
def linear_regression(data, learning_rate=0.001, variance=0.00001):
theta0_guess = 1.
theta1_guess = 1.
theta0_last = 100.
theta1_last = 100.
m = len(data)
while (abs(theta1_guess-theta1_last) > variance or abs(theta0_guess - theta0_last) > variance):
theta1_last = theta1_guess
theta0_last = theta0_guess
hypothesis = create_hypothesis(theta1_guess, theta0_guess) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用caffe来实现Schroff,Kalenichenko和Philbin"FaceNet:用于人脸识别和聚类的统一嵌入"中描述的三重态丢失,2015.
我是新手,所以如何计算反向传播的梯度?
computer-vision neural-network gradient-descent deep-learning caffe
我有一个与此类似的问题.
因为我的资源有限而且我使用深度模型(VGG-16) - 用于训练三重网络 - 我想为128个大小的一个训练示例累积渐变,然后传播错误并更新权重.
我不清楚我该怎么做.我使用tensorflow但欢迎任何实现/伪代码.
Gradient Descent存在局部最小值的问题.我们需要运行梯度下降指数时间来找到全局最小值.
任何人都能告诉我梯度下降的任何替代方案的优缺点.
谢谢.
machine-learning neural-network gradient-descent logistic-regression
我最近在Coursera开始了AI-Class,我有一个与我实现梯度下降算法有关的问题.
这是我当前的实现(我实际上只是将数学表达式"翻译"为Java代码):
public class GradientDescent {
private static final double TOLERANCE = 1E-11;
private double theta0;
private double theta1;
public double getTheta0() {
return theta0;
}
public double getTheta1() {
return theta1;
}
public GradientDescent(double theta0, double theta1) {
this.theta0 = theta0;
this.theta1 = theta1;
}
public double getHypothesisResult(double x){
return theta0 + theta1*x;
}
private double getResult(double[][] trainingData, boolean enableFactor){
double result = 0;
for (int i = 0; i < trainingData.length; i++) {
result = (getHypothesisResult(trainingData[i][0]) - trainingData[i][1]); …Run Code Online (Sandbox Code Playgroud) 我想在python中编写TensorFlow操作,但我希望它是可微分的(能够计算渐变).
这个问题询问如何在python中编写一个op,答案建议使用py_func(没有渐变):Tensorflow:用Python编写一个Op
TF文档描述了如何仅从C++代码添加操作:https://www.tensorflow.org/versions/r0.10/how_tos/adding_an_op/index.html
在我的情况下,我正在进行原型设计,所以我不关心它是否在GPU上运行,我不关心它是否可以从TF python API以外的任何东西使用.
我有一个Scipy稀疏CSR矩阵,它是用SVM-Light格式的稀疏TF-IDF特征矩阵创建的.功能的数量是巨大的,它是稀疏的所以我必须使用SparseTensor,否则它太慢.
例如,要素数量为5,示例文件可能如下所示:
0 4:1
1 1:3 3:4
0 5:1
0 2:1
Run Code Online (Sandbox Code Playgroud)
解析后,训练集如下所示:
trainX = <scipy CSR matrix>
trainY = np.array( [0,1,00] )
Run Code Online (Sandbox Code Playgroud)
我有两个重要问题:
1)我如何有效地将其转换为SparseTensor(sp_ids,sp_weights),以便我使用查找执行快速乘法(WX):https://www.tensorflow.org/versions/master/api_docs/python/nn.html# embedding_lookup_sparse
2)如何在每个时期随机化数据集并重新计算sp_ids,sp_weights以便我可以为小批量梯度下降提供(feed_dict).
像logistic回归这样的简单模型的示例代码将非常受欢迎.图表将是这样的:
# GRAPH
mul = tf.nn.embedding_lookup_sparse(W, X_sp_ids, X_sp_weights, combiner = "sum") # W.X
z = tf.add(mul, b) # W.X + b
cost_op = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(z, y_true)) # this already has built in sigmoid apply
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost_op) # construct optimizer
predict_op = tf.nn.sigmoid(z) # sig(W.X + b)
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写自己的梯度提升算法。我知道有像这样的现有包gbm,xgboost,但我想通过编写自己的包来了解算法的工作原理。
我正在使用iris数据集,我的结果是Sepal.Length(连续)。我的损失函数是mean(1/2*(y-yhat)^2)(基本上是前面有 1/2 的均方误差),所以我对应的梯度就是残差y - yhat。我将预测初始化为 0。
library(rpart)
data(iris)
#Define gradient
grad.fun <- function(y, yhat) {return(y - yhat)}
mod <- list()
grad_boost <- function(data, learning.rate, M, grad.fun) {
# Initialize fit to be 0
fit <- rep(0, nrow(data))
grad <- grad.fun(y = data$Sepal.Length, yhat = fit)
# Initialize model
mod[[1]] <- fit
# Loop over a total of M iterations
for(i in 1:M){
# Fit base learner (tree) …Run Code Online (Sandbox Code Playgroud) 我正在研究一个医疗数据集,我试图减少假阴性.预测"实际上没有疾病时的疾病"对我来说是可以的,但预测"实际上没有疾病时没有疾病".也就是说,我没事,FP但没有FN.
之后做一些研究,我发现喜欢的方式Keeping higher learning rate for one class,using class weights,ensemble learning with specificity/sensitivity等.
我使用类权重来实现接近期望的结果class_weight = {0 : 0.3,1: 0.7},然后调用model.fit(class_weights=class_weight).这给了我非常低的FN但是相当高的FP.我试图尽可能地降低FP,使FN保持在非常低的水平.
我正在努力编写一个自定义丢失函数,Keras这将帮助我惩罚假阴性.谢谢您的帮助.
machine-learning gradient-descent deep-learning keras loss-function
gradient-descent ×10
tensorflow ×3
python ×2
boosting ×1
caffe ×1
gbm ×1
java ×1
keras ×1
r ×1
scipy ×1