Description
Introduction In homework 1, we considered Gradient Descent (and coordinate descent) for minimizing a
regularized loss function. In this homework, we consider an alternative method known as Newton’s algorithm.
We will first run Newton’s algorithm on a simple toy problem, and then implement it from scratch
on a real life classification problem. We will also dig deeper into the idea of estimation and comparing
estimators based on bias, variance and MSE.
Points Allocation There are a total of 28 marks.
• Question 1 a): 1 mark
• Question 1 b): 1 mark
• Question 1 c): 1 mark
• Question 2 a): 2 marks
• Question 2 b): 2 marks
• Question 2 c): 5 marks
• Question 2 d): 1 mark
• Question 2 e): 3 marks
• Question 2 f): 5 marks
• Question 2 g): 1 mark
• Question 3 a): 3 marks
• Question 3 b): 2 marks
• Question 3 c): 1 mark
What to Submit
• A single PDF file which contains solutions to each question. For each question, provide your solution
in the form of text and requested plots. For some questions you will be requested to provide screen
shots of code used to generate your answer — only include these when they are explicitly asked for.
• .py file(s) containing all code you used for the project, which should be provided in a separate .zip
file. This code must match the code provided in the report.
1
• You may be deducted points for not following these instructions.
• You may be deducted points for poorly presented/formatted work. Please be neat and make your
solutions clear. Start each question on a new page if necessary.
• You cannot submit a Jupyter notebook; this will receive a mark of zero. This does not stop you from
developing your code in a notebook and then copying it into a .py file though, or using a tool such as
nbconvert or similar.
• We will set up a Moodle forum for questions about this homework. Please read the existing questions
before posting new questions. Please do some basic research online before posting questions. Please
only post clarification questions. Any questions deemed to be fishing for answers will be ignored
and/or deleted.
• Please check Moodle announcements for updates to this spec. It is your responsibility to check for
announcements about the spec.
• Please complete your homework on your own, do not discuss your solution with other people in the
course. General discussion of the problems is fine, but you must write out your own solution and
acknowledge if you discussed any of the problems in your submission (including their name(s) and
zID).
• As usual, we monitor all online forums such as Chegg, StackExchange, etc. Posting homework questions on these site is equivalent to plagiarism and will result in a case of academic misconduct.
When and Where to Submit
• Due date: Week 7, Monday July 11th, 2022 by 5pm. Please note that the forum will not be actively
monitored on weekends.
• Late submissions will incur a penalty of 5% per day from the maximum achievable grade. For example, if you achieve a grade of 80/100 but you submitted 3 days late, then your final grade will be
80 − 3 × 5 = 65. Submissions that are more than 5 days late will receive a mark of zero.
• Submission must be done through Moodle, no exceptions.
Question 1. Introduction to Newton’s Method
Note: throughout this question do not use any existing implementations of any of the algorithms
discussed unless explicitly asked to in the question. Using existing implementations can result in
a grade of zero for the entire question. In homework 1 we studied gradient descent (GD), which is
usually referred to as a first order method.
Here, we study an alternative algorithm known as Newton’s
algorithm, which is generally referred to as a second order method. Roughly speaking, a second order
method makes use of both first and second derivatives. Generally, second order methods are much
more accurate than first order ones.
Given a twice differentiable function g : R → R, Newton’s method
generates a sequence {x
(k)} iteratively according to the following update rule:
x
(k+1) = x
(k) −
g
0
(x
(k)
)
g
00(x
(k))
, k = 0, 1, 2, . . . , (1)
For example, consider the function g(x) = 1
2
x
2 − sin(x) with initial guess x
(0) = 0. Then
g
0
(x) = x − cos(x), and g
00(x) = 1 + sin(x),
and so we have the following iterations:
x
(1) = x
(0) −
x
(0) − cos(x
0
)
1 + sin(x
(0))
= 0 −
0 − cos(0)
1 + sin(0) = 1
x
(2) = x
(1) −
x
(1) − cos(x
1
)
1 + sin(x
(1))
= 1 −
1 − cos(1)
1 + sin(1) = 0.750363867840244
x
(3) = 0.739112890911362
.
.
.
and this continues until we terminate the algorithm (as a quick exercise for your own benefit, code this
up, plot the function and each of the iterates).
We note here that in practice, we often use a different
update called the dampened Newton method, defined by:
x
(k+1) = x
(k) − α
g
0
(xk)
g
00(xk)
, k = 0, 1, 2, . . . . (2)
Here, as in the case of GD, the step size α has the effect of ‘dampening’ the update.
(a) Consider the twice differentiable function f : R
n → R. The Newton steps in this case are now:
x
(k+1) = x
(k) − (H(x
(k)
))−1∇f(x
(k)
), k = 0, 1, 2, . . . , (3)
where H(x) = ∇2f(x) is the Hessian of f.
Explain heuristically (in a couple of sentences) how the
above formula is a generalization of equation (1) to functions with vector inputs. what to submit:
Some commentary
(b) Consider the function f : R
2 → R defined by
f(x, y) = 100(y − x
2
)
2 + (1 − x)
2
.
Create a 3D plot of the function using mplot3d (see lab0 for example). Further, compute the
gradient and Hessian of f. what to submit: A single plot, the code used to generate the plot, the gradient
and Hessian calculated along with all working. Add a copy of the code to solutions.py
(c) Using NumPy only, implement the (undampened) Newton algorithm to find the minimizer of the
function in the previous part, using an initial guess of x
(0) = (−1.2, 1)T
. Terminate the algorithm
when
∇f(x
(k)
)
2
≤ 10−6
. Report the values of x
(k)
for k = 0, 1, . . . , K where K is your final
iteration. what to submit: your iterations, and a screen shot of your code. Add a copy of the code to
solutions.py
Question 2. Solving Logistic Regression Numerically
Note: throughout this question do not use any existing implementations of any of the algorithms
discussed unless explicitly asked to do so in the question. Using existing implementations can
result in a grade of zero for the entire question. In this question we will compare gradient descent
and Newton’s algorithm for solving the logistic regression problem.
Recall that in logistic regresion,
our goal is to minimize the log-loss, also referred to as the cross entropy loss. For an intercept β0 ∈ R,
parameter vector β = (β1, . . . , βp) ∈ R
p
, target yi ∈ {0, 1}, and feature vector xi = (xi1, xi2, . . . , xip)
T ∈
R
p
for i = 1, . . . , n, the (`2-regularized) log-loss that we will work with is:
L(β0, β) = 1
2
kβk
2
2 +
λ
n
Xn
i=1
yi
ln
1
σ(β0 + β
T xi)
+ (1 − yi) ln
1
1 − σ(β0 + β
T xi)
,
where σ(z) = (1 + e
−z
)
−1
is the logistic sigmoid, and λ is a hyper-parameter that controls the amount
of regularization. Note that you are provided with an implementation of this loss in helper.py.
(a) Suppose that you were going to solve this problem using gradient descent and chose to update
each coordinate individually. Derive gradient descent updates for each of the components β0, β1, . . . , βp
for step size α and regularization parameter λ.
That is, derive explicit expressions for the terms †
in the following:
β
(k)
0 = β
(k−1)
0 − α × †
β
(k)
1 = β
(k−1)
1 − α × †
β
(k)
2 = β
(k−1)
2 − α × †
.
.
.
β
(k)
p = β
(k−1)
p − α × †
Make your expression as simple as possible, and be sure to include all your working. Hint: If you
haven’t done so already, take a look at Question 4 of Tutorial 3. what to submit: your coordinate
level GD updates along with any working.
(b) For the non-intercept components β1, . . . , βp, re-write the gradient descent updates of the previous
question in vector form, i.e. derive an explicit expression for the term † in the following:
β
(k) = β
(k−1) − α × †
Your expression should only be in terms of β0, β, xi and yi
. Next, let γ = [β0, βT
]
T be the (p + 1)-
dimensional vector that combines the intercept with the coefficient vector β, write down the update
γ
(k) = γ
(k−1) − α × †.
Note: This final expression will be our vectorized implementation of gradient descent. The point
of the above exercises is just to be careful about the differences between intercept and non-intercept
parameters. Doing GD on the coordinates is extremely innefficient in practice. what to submit: your
vectorized GD updates along with any working.
(c) Derive the (dampened) Newton updates for the logistic regression problem with step size α. You
should do this in vector form as in the previous question. Make sure to include all your working.
For notational ease, you might find it helpful to write z
(k)
i = β
(k)
0 + x
T
i β
(k)
. Hint: When doing
this question, first solve it without the regularization term (i.e. ignore the ridge penalty term
and take λ = 1). Once you have a form for the Hessian in that case, it should be more straightforward to extend it to the the more general setting needed here. what to submit: your vectorized
dampened Newton updates along with any working.
(d) We will now compare the performance of GD and the Newton algorithm on a real dataset using
the derived updates in the previous parts. To do this, we will work with the songs.csv dataset.
The data contains information about various songs, and also contains a class variable outlining the
genre of the song. If you are interested, you can read more about the data here, though a deep
understanding of each of the features will not be crucial for the purposes of this assessment. Load
in the data and preform the follwing preprocessing:
(I) Remove the following features: ”Artist Name”, ”Track Name”, ”key”, ”mode”, ”time signature”,
”instrumentalness”
(II) The current dataset has 10 classes, but logistic regression in the form we have described it here
only works for binary classification. We will restrict the data to classes 5 (hiphop) and 9 (pop).
After removing the other classes, re-code the variables so that the target variable is y = 1 for
hiphop and y = 0 for pop.
(III) Remove any remaining rows that have missing values for any of the features. Your remaining
dataset should have a total of 3886 rows.
(IV) Use the sklearn.model selection.train test split function to split your data into
X train, X test, Y train and Y test. Use a test size of 0.3 and a random state of 23 for
reproducibility.
(V) Fit the sklearn.preprocessing.StandardScaler to the resulting training data, and
then use this object to scale both your train and test datasets.
(VI) Print out the first and last row of X train, X test, y train, y test (but only the first three columns
of X train, X test).
What to submit: the print out of the rows requested in (VI). A copy of your code in solutions.py
A quick aside: Backtracking Line Search: In homework 1, we chose the step-size parameter in our
implementations naively by looking at a grid of step-sizes and choosing the best one. In practice,
this is obviously not feasible (computational cost of training the model multiple times for a large
number of candidate step-sizes).
One very popular and empirically successful approach is known
as Backtracking Line Search (BLS). In BLS, the step-size is chosen adaptively at each iteration of the
algorithm by checking a given criteria. In particular, choose parameters 0 < a ≤ 0.5 and 0 < b < 1.
At iteration k of the algorithm (where we are minimizing the function f(x)), the current iterate is
x
(k)
, set the step-size to α = 1. Then, while
f(x
(k) − α∇f(x
(k)
)) > f(x) − aαk∇f(x
(k)
)k
2
2
,
shrink the step-size according to α = bα, otherwise use the current step-size α in your update. We
will not explain why this is a sensible thing to do here, but you will be able to find information
about it online if you are interested.
(Of course, we can also discuss it during one of the consultation
sessions). Importantly however, the BLS idea can be applied in both gradient descent and the
dampened Newton algorithm, and you will be required to use the BLS in your implementations of
both algorithms in the following questions.
(e) Run gradient descent with backtracking line search on the training dataset for 60 epochs and λ =
0.5, and initalize β
(0)
0 = 0, β(0) = 0p, where 0p is the p-dimensional vector of zeroes.
For your BLS
implementation take a = 0.5, b = 0.8. Report your train and test losses, as well as plots of your
step-sizes at each iteration, and train loss at each iteration. Hint: if you need a sanity check here,
the best thing to do is use sklearn to fit logistic regression models.
This should give you an idea
of what kind of loss your implementation should be achieving (if your implementation does as
well or better, then you are on the right track) what to submit: two plots, one for the step-sizes and the
other for the train losses. Report your train and test losses, and a screen shot of any code used in this section,
as well as a copy of your code in solutions.py.
(f) Run the dampened Newton algorithm with backtracking line search on the training dataset for 60
epochs and λ = 0.5. Use the same parameters for your BLS algorithm as in the previous question.
Use the same initialization for β0, β as in the previous question Report your train and test losses,
as well as plots of your step-sizes at each iteration. Further, provide a single plot showing the train
loss for both GD and Newton algorithms (use labels/legends to make your plot easy to read). what
to submit: two plots, one for the step-sizes and the other for the train losses (of both GD and Newton).
Report
your train and test losses, and a screen shot of any code used in this section, as well as a copy of your code in
solutions.py.
(g) In general, it turns out that Newton’s method is much better than GD, in fact convergence of the
Newton algorithm is quadratic, whereas convergence of GD is linear (much slower than quadratic).
Given this, why do you think gradient descent and its variants (e.g. SGD) are much more popular
for solving machine learning problems? what to submit: some commentary
Question 3. More on MLE
Let X1, . . . , Xn
i.i.d. ∼ N(µ, σ2
). Recall that in Tutorial 2 we showed that the MLE estimators of µ, σ2 were
µˆMLE and σˆ
2
MLE where
µˆMLE = X, and σˆ
2
MLE =
1
n
Xn
i=1
(Xi − X)
2
.
In this question, we will explore these estimators in more depth.
Page 6
(a) Find the bias and variance of both µˆMLE and σˆ
2
MLE. Hint: You may use without proof the fact that
var
1
σ
2
Xn
i=1
(Xi − X)
2
!
= 2(n − 1)
what to submit: the bias and variance of the estimators, along with your working.
(b) Your friend tells you that they have a much better estimator for σ
2
, namely:
σ˜
2 =
1
n − 1
Xn
i=1
(Xi − X)
2
.
Discuss whether this estimator is better or worse than the MLE estimator:
σˆ
2
MLE =
1
n
Xn
i=1
(Xi − X)
2
.
Be sure to include a detailed analysis of the bias and variance of both estimators, and describe what
occurs to each of these quantities (for each of the estimators) as the sample size n increases (use
plots). For your plots, you can assume that σ = 1.
what to submit: the bias and variance of the new estimator. A plot comparing the bias of both estimators as
a function of the sample size n, a plot comparing the variance of both estimators as a function of the sample
size n, use labels/legends in your plots. A copy of the code used here in solutions.py
(c) Compute and then plot the MSE of the two estimators considered in the previous part. For your
plots, you can assume that σ = 1. Provide some discussion as to which estimator is better (according to their MSE), and what happens as the sample size n gets bigger. what to submit: the MSEs of
the two variance estimators.
A plot comparing the MSEs of the estimators as a function of the sample size
n, and some commentary. Use labels/legends in your plots. A copy of the code used here in solutions.py
Page 7